如题,对于c来说<< 和 >> 是针对无符号整数,高位低位都是自动补0;而对java来说模糊了这个概念,Java如果直接>>右移,他的符号位不变,左边补上符号位,即正数补零,负数补1。只有>>>才是全部补0的,而对于左移都是低位补0,没有区别。
参考:java移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
这点在leetcode这题上特别明显:
Reverse Bits
Reverse bits of a given 32 bits unsigned integer.
java
public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) { n = (n >>> 16) | (n << 16);//切半交换 n = ((n & 0xff00ff00) >>> 8) | ((n & 0x00ff00ff) << 8);//1/4切半交换 n = ((n & 0xf0f0f0f0) >>> 4) | ((n & 0x0f0f0f0f) << 4);//1/8切半交换 n = ((n & 0xcccccccc) >>> 2) | ((n & 0x33333333) << 2);//1100&0011 n = ((n & 0xaaaaaaaa) >>> 1) | ((n & 0x55555555) << 1);//1010&0101 return n; } }
c class Solution { public: uint32_t reverseBits(uint32_t n) { n = (n >> 16) | (n << 16);//切半交换 n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);//1/4切半交换 n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);//1/8切半交换 n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);//1100&0011 n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);//1010&0101 return n; } };