任何人都可以帮助n&-n
的意思吗?
它的意义是什么。
答案 0 :(得分:21)
这是一个老技巧,它给出了一个数字,其中包含一个位,即n
中设置的最低位。至少在二进制补码算法中,这几天几乎是普遍的。
它起作用的原因:数字的负数是通过反转数字,然后加1(这是二进制补码的定义)产生的。当你加1时,从底部开始的每个位都会溢出到下一个更高的位;一旦达到零位,这就会停止。那些溢出的位都将为零,并且受影响的最后一位之上的位将是彼此相反的位,因此剩下的唯一位是停止级联的位 - 从1开始并被反转为0的位。 / p>
P.S。如果你担心运行一个补码运算,那么这个版本适用于:
n & (~n + 1)
答案 1 :(得分:4)
在几乎所有大多数人真正关心的系统中,它会给你2的最大功率,n可以被整除。
答案 2 :(得分:2)
这只是一个按位和数字。负数表示为two's complement。
因此,例如,按位和7&( - 7)是x00000111& x11111001 = x00000001 = 1
答案 3 :(得分:2)
N&(-N)
将以二进制形式'1'
给出 first 位N
的位置。
例如:
N = 144 (0b10010000) => N&(-N) = 0b10000
N = 7 (0b00000111) => N&(-N) = 0b1
此技巧的一个应用是将整数转换为2的幂。 例如:
To convert 22 = 16 + 4 + 2 = 2^4 + 2^2 + 2^1
22&(-22) = 2, 22 - 2 = 20
20&(-20) = 4, 20 - 4 = 16
16&(-16) = 16, 16 - 16 = 0
答案 4 :(得分:1)
我认为找出n是2的幂是一个技巧。(n ==(n&amp; -n))IFF n是2(1,2,4,8)的幂。< / p>
答案 5 :(得分:0)
我会在Mark Randsom的精彩阐述中添加一个不言自明的例子。
010010000 | +144 ~
----------|-------
101101111 | -145 +
1 |
----------|-------
101110000 | -144
101110000 | -144 &
010010000 | +144
----------|-------
000010000 | 16`
答案 6 :(得分:0)
因为x & -x = {0, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1, 32}
的{{1}}从0到32.它用于跳转某些应用程序的for序列。应用程序可以存储累积的记录。
x
循环遍历非常快,因为它寻找下一个2的幂来跳转。
答案 7 :(得分:-2)
正如@aestrivex所提到的,这是一种写作方式1.即使我遇到了这个
for (int y = x; y > 0; y -= y & -y)
它只是意味着y = y-1因为
7&amp;( - 7)是x00000111&amp; x11111001 = x00000001 = 1