我认为这很容易因为〜,但是〜只返回2 ^ x而不是0的负值。
答案 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进行比较,否则您不会遇到这种情况。