Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这段涉及xor的代码实际上是如何工作的?_Java_Algorithm_Bit Manipulation_Bitwise Operators - Fatal编程技术网

Java 这段涉及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相同的值(并且不是最右边的位集)。 代码的逻辑是找到一个数字,该数字表示构成

我有一个变量,表示2个数的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延迟的数字?所以注释实际上是指最低有效位?只是好奇。你怎么记得这些东西?你经常写代码操作位吗?我问你是因为我总是对其他人做什么感兴趣,以防它能帮助我改进“你经常写代码操作位吗?”。