Java 这段涉及xor的代码实际上是如何工作的?
我有一个变量,表示2个数的XOR。例如:Java 这段涉及xor的代码实际上是如何工作的?,java,algorithm,bit-manipulation,bitwise-operators,Java,Algorithm,Bit Manipulation,Bitwise Operators,我有一个变量,表示2个数的XOR。例如:intxor=7^2 我正在研究一段代码,根据注释查找XOR中设置的最右边的位: int-rightBitSet=xor&~(xor-1) 我无法理解这段代码到底是如何工作的。我的意思是在7^2的情况下,它确实会将rightBitSet设置为0001(二进制),即1。(实际上是最右边的位集) 但是,如果xor是7^3,则rightBitSet将被设置为0100,即4,这也是与xor相同的值(并且不是最右边的位集)。 代码的逻辑是找到一个数字,该数字表示构成
intxor=7^2代码>
我正在研究一段代码,根据注释查找XOR中设置的最右边的位:
int-rightBitSet=xor&~(xor-1)代码>
我无法理解这段代码到底是如何工作的。我的意思是在7^2
的情况下,它确实会将rightBitSet
设置为0001
(二进制),即1。(实际上是最右边的位集)
但是,如果xor
是7^3
,则rightBitSet
将被设置为0100
,即4
,这也是与xor
相同的值(并且不是最右边的位集)。
代码的逻辑是找到一个数字,该数字表示构成异或的数字之间的不同位,尽管注释表明它找到了
最右边的位集,在我看来,代码在任何位置都会找到一个具有1个不同位的位模式。
我说得对吗?我也不确定代码是如何工作的。似乎一个数字X
与其二进制表示中的数字X-1
之间存在某种关系?
这是什么关系 从二进制数中减去1的效果是用0替换其中最低有效的1,并将所有低有效位设置为1。例如:
5 - 1 = 101 - 1 = 100 = 4
4 - 1 = 100 - 1 = 011 = 3
6 - 1 = 110 - 1 = 101 = 5
因此,在计算x&~(x-1)
:在x
的最低有效值1之上,~(x-1)
具有与~x
相同的设置位,因此在x
的最低有效值1之上,x&~(x-1)
没有1位。根据定义,x
的最低有效位为1,正如我们在上面看到的那样,~(x-1)
也会,但是~(x-1)
的最低有效位为0。因此,x&~(x-1)
将只有一个1位,至少是x
的最低有效位,但7^2将第二位反转为最高位。不要碰其他的位子。7是111 2是010,所以我们有101作为结果与我的问题无关。我不是问什么是异或,你可能已经猜到7^7从7中减去7,哪个结果有趣。我没有注意到。但是这对我的OP有什么帮助?第一部分可能是+1的重复。我根本不理解第二段。在x的上面最低有效值1,x&~(x-1)没有1位
。为什么?换句话:从二进制数中减去1的唯一效果是将其中最低有效的1替换为0。所以x-1
的位与x
的位相同,在x
的ls1上方,所以x&~(x-1)
都比x的ls1高0。我想我明白了。所以本质上,我们得到的表示是最低有效位集(上面和下面的位都是清晰的)组成xor延迟的数字?所以注释实际上是指最低有效位?只是好奇。你怎么记得这些东西?你经常写代码操作位吗?我问你是因为我总是对其他人做什么感兴趣,以防它能帮助我改进“你经常写代码操作位吗?”。