我正试图理解位移操作的原理。请问有人可以解释一下以下代码的意义吗?
我正在尝试理解位移操作的工作原理。请问有人能够解释一下以下代码的含义吗?
while ((n&1)==0) n >>= 1;
其中n
是一个整数,请给出一个执行移位操作时的n
的示例。
我正在尝试理解位移操作的工作原理。请问有人能够解释一下以下代码的含义吗?
while ((n&1)==0) n >>= 1;
其中n
是一个整数,请给出一个执行移位操作时的n
的示例。
分解一下:
n & 1
将对 n 和 1 进行二进制比较,其中1的二进制表示为00000000000000000000000000000001
。因此,当n以1结尾(即正奇数或负偶数)时,它将返回00000000000000000000000000000001
,否则返回00000000000000000000000000000000
。
(n & 1) == 0
对于偶数(或负奇数)返回 true,其他情况返回 false。
n >> = 1
等同于 n = n >> 1
。它将所有位向右移动,大致相当于除以2(向下取整)。
例如,如果 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
所以while循环的条件为真。实际上,(n&1)
被用于提取n
的最低有效位。n
右移1
位来进行循环。将一个数向右移动k
位相当于将该数除以2^k
。n
为00000000 00000000 00000000 00000100
,右移一位后变成了00000000 00000000 00000000 00000010
,即2
。n
的最低有效位,即0
,并再次右移,得到00000000 00000000 00000000 0000001
,这是1
。n
的最低有效位,此时为1
,循环终止。n
除以2
,直到它成为奇数,因为奇数具有其最低有效位设置。n
从开始就是0
,则会进入无限循环,因为无论你将0
除以2
多少次,你都不会得到一个奇数。假设等于42
(只是因为):
int n = 42;
while ((n & 1) == 0) {
n >>= 1;
}
迭代0:
n = 42
(或0000 0000 0000 0000 0000 0000 0010 1010
)n & 1 == 0
是true
(因为n&1 = 0,或0000 0000 0000 0000 0000 0000 0000 0000
)迭代1:
n = 21
(或0000 0000 0000 0000 0000 0000 0001 0101
)n & 1 == 0
是false
(因为n & 1 == 1
或0000 0000 0000 0000 0000 0000 0000 0001
)它的作用:
基本上,循环将n除以2,只要n是偶数:
例如,如果 n 是
n= b11110000
那么
n&1= b11110000 &
b00000001
---------
b00000000
n>>=1 b11110000 >> 1
---------
b01111000
n= b01111000
n= b00001111
n & 1 实际上是一个按位与操作。这里,n 的位模式将与 1 的位模式进行 AND 运算。其结果将与零进行比较。如果是,则 n 将向右移动 1 次。您可以将一个右移视为除以 2 等等。
(n & 1) == 0
对于正偶数和负偶数都是正确的。 - Ilya