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

Python 检查所有位是否为1的最佳方法是什么?,python,python-2.7,bit-manipulation,bit,Python,Python 2.7,Bit Manipulation,Bit,我认为这很容易,因为~,但是~只返回一个负值2^x,而不是0 最简单的方法是检查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' >

我认为这很容易,因为~,但是~只返回一个负值2^x,而不是0

最简单的方法是检查
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的幂的标准(小于2的幂的数字1都是1s),并对零进行特殊情况检查:

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

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

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

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");
}

您可能需要的是XOR(
^
)运算符,而不是您尝试的按位not(
~
)运算符(因为它只是还原每个位)。由于您提到了
~
操作符作为初始方法,因此我假设您希望通过将整数与所有1进行比较来确定整数中的所有位是否都是1。也许你是在优化速度

只有当操作数中的任一位为1时,异或运算符才会返回1。因此,无论任何位为0,它都将给出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进行比较。

您要测试多少位
1
设置了所有位,前提是您只需要1位。请记住,Python整数的大小是任意的,Python整数中没有固定位数。对于
3
7
15
等数字,是否要返回
true
?(二进制代码11、111、1111)对于
1
3
7
15
等,这将返回true,如果OP考虑的是特定的C整数大小,则可能会出现意外情况。