int eor = 5;
int rightOne = eor & (~eor + 1);
eor & (~eor + 1)
代码解析:
~ 按位取反运算符
~eor
它会将 eor 的二进制表示中的每一位进行取反操作,即 0 变为 1,1 变为 0。
~eor + 1
在二进制运算中,对一个数取反后加 1 实际上就是求这个数的补码。
原因:计算机使用最高位(最左边一位)作为符号位。0表示正数,1表示负数。这是因为使用最高位作为符号位可以直接决定数的正负,同时剩余的位可以用于表示数值部分。
对于正数,补码和原码相同;对于负数,补码是原码取反加 1。这里 ~eor + 1 得到的结果和 -eor 是一样的(在计算机中负数以补码形式存储)。
eor & (~eor + 1)
这段代码的主要功能是找出整数 eor 二进制表示中最右侧的 1 所对应的数,也就是提取出 eor 二进制形式里最右边的 1,其余位都置为 0。由于 ~eor + 1 是 eor 的补码,在 eor 中最右边的 1 所在的位置,eor 和它的补码该位都为 1,而其他位置上 eor 和它的补码必然是一个为 0 另一个为 1。所以进行按位与运算后,只有最右边的 1 会被保留,其余位都变为 0。
& 和 && 的基本区别
&(按位与/逻辑与):& 在Java中有两种主要的用途:作为按位运算符和作为逻辑运算符。
&&(短路与):&& 仅用于逻辑运算。