Java 中的位移位
我试图理解位移是如何工作的。有人可以解释一下这句话的含义吗:
while ((n&1)==0) n >>= 1;
其中 是一个整数,并在执行移位时给我一个示例。n
n
我试图理解位移是如何工作的。有人可以解释一下这句话的含义吗:
while ((n&1)==0) n >>= 1;
其中 是一个整数,并在执行移位时给我一个示例。n
n
分解:
n & 1
将在 n 和二进制的 1 之间进行二进制比较。因此,当 n 以 1(正奇数或负偶数)结尾时,它将返回。00000000000000000000000000000001
00000000000000000000000000000001
00000000000000000000000000000000
(n & 1) == 0
因此,如果 n 是偶数(或负奇数),否则为假,则为真。
n >> = 1
等效于 。因此,它将所有位向右移动,这大致相当于除以二(向下舍入)。n = n >> 1
例如,如果n开始为12,那么在二进制中它将是1100。在一个循环之后,它将是110(6),之后它将是11(3),然后循环将停止。
如果 n 是 0,那么在下一个循环之后,它仍然是 0,循环将是无限的。
让我们在二进制中表示为:n
4
00000000 00000000 00000000 00000100
(n&1)
按位和与 .
具有以下二进制表示形式:n
1
1
00000000 00000000 00000000 00000001
按位和的结果是:0
00000000 00000000 00000000 00000100 = n
00000000 00000000 00000000 00000001 = 1
------------------------------------
00000000 00000000 00000000 00000000 = 0
所以同时的条件是正确的。
有效地用于提取 的最低有效位。(n&1)
n
在 while 循环中,您将 shift() 右移 () 改为 .将数字右移一次等于将数字除以 。>>
n
1
k
2^k
n
它现在正在右移一旦变成哪个是.00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000010
2
接下来,我们再次提取LSB(最低有效位),这是和右移再次给出哪个是。n
0
00000000 00000000 00000000 0000001
1
接下来,我们再次提取 n 的 LSB,现在是现在,循环中断。1
因此,有效地,您一直在将数字除以,直到它变得奇数,因为奇数具有LSB集。n
2
还要注意,如果是开始,你将进入一个无限循环,因为无论你除以多少次,你都不会得到一个奇数。n
0
0
2