Bitshifting in Java

Ale*_*der 11 java bit-manipulation shift

I'm trying to understand how bit shift works. Can someone please explain the meaning of this line:

while ((n&1)==0) n >>= 1;
Run Code Online (Sandbox Code Playgroud)

where n is an integer and give me an example of a n when the shift is executed.

Jon*_*nna 17

打破它:

n & 1将在n和1之间进行二进制比较,它是00000000000000000000000000000001二进制的.因此,00000000000000000000000000000001当n结束于1(正奇数或负偶数)时,它将返回00000000000000000000000000000000.

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

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

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

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


cod*_*ict 9

n4该二进制表示为:

00000000 00000000 00000000 00000100
Run Code Online (Sandbox Code Playgroud)

(n&1)按位和n1.
1具有以下二进制表示:

00000000 00000000 00000000 00000001
Run Code Online (Sandbox Code Playgroud)

按位的结果是0:

00000000 00000000 00000000 00000100 = n
00000000 00000000 00000000 00000001 = 1
------------------------------------
00000000 00000000 00000000 00000000 = 0
Run Code Online (Sandbox Code Playgroud)

所以条件是真实的.
有效地(n&1)用于提取最低有效位n.

在while循环,你右移(>>)n通过1.右移数字k与将数字除以相同2^k.

n现在正在00000000 00000000 00000000 00000100转移,一旦变为 00000000 00000000 00000000 00000010哪个2.

接下来,我们n再次提取LSB(最低有效位),然后再次0右移以给出00000000 00000000 00000000 0000001哪个是1.

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

所以,有效的,你不断分裂你的电话号码n通过2,直至变为奇数为奇数有其LSB集.

还要注意的是,如果n0先从你会进入一个无限循环,因为无论你有多少次划分02你不会得到一个奇数.


Blu*_*kMN 4

假设 n = 12。其位数为 1100 (1*8 + 1*4 + 0*2 + 0*1 = 12)。第一次循环 n & 1 == 0 因为 1100 的最后一位数字是 0,当你与 1 相与时,你得到 0。所以 n >>= 1 将导致 n 从 1100 (12) 变为 110 (6)。您可能会注意到,右移与除以 2 具有相同的效果。最后一位仍然为零,因此 n & 1 仍为 0,因此它会再右移一次。n>>=1 将导致它向右再移动一位数字,将 n 从 110 (6) 更改为 11 (3)。

现在您可以看到最后一位是 1,因此 n & 1 将是 1,导致 while 循环停止执行。循环的目的似乎是将数字向右移动,直到找到第一个打开的位(直到结果为奇数)。