任何人都可以帮什么n&-n
手段? 什么是它的意义。
Answer 1:
我相信这是要弄清楚,如果n是2的幂(N = =(N-N))IFF n是2(1,2,4,8),电源一招。
Answer 2:
这是一个老把戏,让在它的单个位,即在设定的底部有点数n
。 至少在两个互补算术,这只是有关通用这些天。
它的工作原理的原因:一个数的负被反转的数量,再加入1产生的(这是两个互补的定义)。 当您添加1次,每次位开始,它被设置将溢出到下一个较高位的底部; 这将停止一旦你达到一个零位。 这些溢出位都将是零,而受影响的将是彼此的倒数最后一个以上的位,所以唯一的位左边是停止级联的一个 - 即开始为1,呈倒到0的一个。
PS。如果你担心跨这里的补数算术运行是与这两个工作的版本:
n & (~n + 1)
Answer 3:
在几乎大部分人真正关心每一个系统,它会给你2的最大功率n是由整除。
Answer 4:
这只是一个按位与数量。 负数表示为二进制补码 。
因此,例如,逐位和7( - 7)是x00000111&x11111001 = x00000001 = 1
Answer 5:
N&(-N)
将会给你的第一比特的位置'1'
在二进制形式N
。 例如:
N = 144 (0b10010000) => N&(-N) = 0b10000
N = 7 (0b00000111) => N&(-N) = 0b1
这一招的一个应用是要转换的整数和power-的-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
Answer 6:
我想补充一个不言自明的例子给马克Randsom的精彩论述。
010010000 | +144 ~
----------|-------
101101111 | -145 +
1 |
----------|-------
101110000 | -144
101110000 | -144 &
010010000 | +144
----------|-------
000010000 | 16`
Answer 7:
因为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}
为x
为0〜32它是用来跳动在用于某些应用的序列。 该应用程序可以存储累积记录。
for(;x < N;x += x&-x) {
// do something here
++tr[x];
}
循环遍历非常快,因为它看起来为2的下一个动力跳。
Answer 8:
正如@aestrivex已经提到的,是写作1.Even的我遇到这样的方式
for (int y = x; y > 0; y -= y & -y)
它只是意味着Y = Y-1,因为
7( - 7)是x00000111&x11111001 = x00000001 = 1