原文 3.5.10 位运算符 处理整型类型时,还有一些运算符可以直接处理组成整数的各个位。这意味着可以使用掩码技术得到一个数中的各个位。位运算符包括: &(and) 、 |(or) ^(xor) ~(not) 这些运算符按位模式操作。例如,如果n是一个整数变量,而且n的二进制表示中从右边数第一位是1,则 int fourthBitFromRight = (n & 0b1000) / 0b1000; 会返回1 ,否则返回0 。利用 & 并结合适当的2的幂,可以屏蔽其他位,而只留下其中的某一位。 注释:应用在布尔值上时,& 和 | 运算符也会得到一个布尔值。这些运算符与 && 和 || 运算符很类似,不过 & 和 | 运算符不采用"短路"方式来计算,也就是说,计算结果之前,两个操作数都需要计算。 另外,还有 >> 和 << 运算符可以将位模式左移或右移。需要建立位模式来完成位掩码时,这两个运算符会很方便: int fourthBitFromRight = (n & (1 <<3) ) >>3; 最后,>>> 运算符会用0填充高位,这与 >> 不同, >>会用符号位填充高位。不存在 <<< 运算符。 警告:移位运算符的右操作要完成模32的操作(除非左操作数是long类型,在这种情况下需要完成模64运算)。例如,1 << 35的值等同于 1<< 3 或 8 C++注释:在C/C++中,不能保证 >>是完成算术移位(扩展符号位)还是逻辑移位(填充0)。实现者可以选择其中更高效的任何一种操作。这意味着C/C++中的 >> 运算符对负数生成的结果可能会依赖于具体的实现。Java则消除了这种不确定性。 个人补充 位运算在开发中应用并不多,甚至很多地方为了"照顾整个小组的水平",不建议,或者禁止使用位运算。位运算是直接操作计算机底层的二进制数,所以效率高,但可读性很差。 比如1 的二进制为 000...001 (31个0,最后是1,int 是32 位) 对1进行 << 操作也就是所有的32位都左移,最左边的就会溢出,被舍弃,而右边空出来一位,补位0,结果就是 000...0010(30个0,然后是10,也就是二进制 的10,也就是2)。 同理 1 << 3 就是整体左移3位,其结果为000...001000(28个0,然后是1000,也就是二进制 的1000,也就是8) 。 关于二进制与十进制的转换,可以使用windows的计算器。