按位和(&)正数和负数的含义?

时间:2013-03-13 20:02:04

标签: c++ bitwise-and

任何人都可以帮助n&-n的意思吗? 它的意义是什么。

8 个答案:

答案 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