检查所有位是否为1的最佳方法是什么?

时间:2016-05-24 04:46:00

标签: python python-2.7 bit-manipulation bit

我认为这很容易因为〜,但是〜只返回2 ^ x而不是0的负值。

4 个答案:

答案 0 :(得分:7)

您可以修改标准bithack,以检查数字是2的幂(数字1的幂小于1的全部是1),特殊情况检查为零:

def allOnes(n):
    return ((n+1) & n == 0) and (n!=0)

print allOnes(255)
print allOnes(158)
print allOnes(0)
print allOnes(-1)
print allOnes(-2)

输出:

True
False
False
True
False

答案 1 :(得分:1)

最简单的方法是检查0中是否存在bin(n)。以下是一些例子:

拥有全部1的数字:

>>> n=15
>>> bin(n)
'0b1111'
>>> bin(n)[2:]
'1111'
>>> '0' in bin(n)[2:]
False

具有1个或更多0的数字:

>>> n=5
>>> bin(n)
'0b101'
>>> bin(n)[2:]
'101'
>>> '0' in bin(n)[2:]
True

答案 2 :(得分:1)

大多数语言使用MSB(最高有效位)作为有符号值位。例如,二进制中的00000001为十进制1,二进制为10000011,十进制为-125(因为MSB为1(-128),而00000011为十进制3(-128 + 3 = -125))。

因此,所有位为1的二进制数等于-1的十进制数。 所以简单地说,如果byte_value是有符号整数,

if(byte_value = -1)
{
    printf("All One's");
}
else
{
    printf("All Not One's");
}

否则

if(byte_value = 255)
{
    printf("All One's");
}
else
{
    printf("All Not One's");
}

答案 3 :(得分:0)

您可能想要的是XOR(^)运算符,而不是您尝试的按位NOT(~)运算符(因为它只恢复每一位)。由于您提到~运算符是您的最初方法,因此我假设您想通过与全为1的整数进行比较来找出整数中的所有位是否为1。也许您正在优化速度。

仅当操作数中的任何一位为1时,XOR运算符才会返回1。因此,无论任何一位为0,XOR运算符都将返回1。

>>> 100 ^ 000
100
>>> 100 ^ 100
0
>>> 111 ^ 101
10
>>> 111 ^ 111
0

(如您所见,结果整数没有被填充,但这对我们而言并不重要。)

唯一的“陷阱”是您需要提前知道号码中的位数。

然后,您可以通过查看结果数字是否大于0来检查其中的所有位是否为1。如果是,那么您就知道并非所有位都为1。

示例:

someNumberWithThreeBits ^ 111 == 0每当someNumberWithThreeBits中的所有位均为1时将返回True,否则返回false。

PS:请注意,000 ^ 000也将返回0。但是在这种情况下,除非您决定与000而不是111进行比较,否则您不会遇到这种情况。