Java 中的位移位

2022-09-03 09:26:48

我试图理解位移是如何工作的。有人可以解释一下这句话的含义吗:

while ((n&1)==0) n >>= 1;

其中 是一个整数,并在执行移位时给我一个示例。nn


答案 1

分解:

n & 1将在 n 和二进制的 1 之间进行二进制比较。因此,当 n 以 1(正奇数或负偶数)结尾时,它将返回。000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000

(n & 1) == 0因此,如果 n 是偶数(或负奇数),否则为假,则为真。

n >> = 1等效于 。因此,它将所有位向右移动,这大致相当于除以二(向下舍入)。n = n >> 1

例如,如果n开始为12,那么在二进制中它将是1100。在一个循环之后,它将是110(6),之后它将是11(3),然后循环将停止。

如果 n 是 0,那么在下一个循环之后,它仍然是 0,循环将是无限的。


答案 2

让我们在二进制中表示为:n4

00000000 00000000 00000000 00000100

(n&1)按位和与 .
具有以下二进制表示形式:n11

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() 右移 () 改为 .将数字右移一次等于将数字除以 。>>n1k2^k

n它现在正在右移一旦变成哪个是.00000000 00000000 00000000 0000010000000000 00000000 00000000 000000102

接下来,我们再次提取LSB(最低有效位),这是和右移再次给出哪个是。n000000000 00000000 00000000 00000011

接下来,我们再次提取 n 的 LSB,现在是现在,循环中断。1

因此,有效地,您一直在将数字除以,直到它变得奇数,因为奇数具有LSB集。n2

还要注意,如果是开始,你将进入一个无限循环,因为无论你除以多少次,你都不会得到一个奇数。n002


推荐