-->

意思是正,负号的按位与(&)的?(Meaning of bitwise and(&) of a po

2019-08-17 14:19发布

任何人都可以帮什么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



文章来源: Meaning of bitwise and(&) of a positive and negative number?