我正在寻找一种创新的方法来检查一个数字在signed int中是否只有一个位.
我很清楚我可以简单地使用计数器,一些模块化分区和一个位移来进行循环.但我很好奇是否有更好的方法,因为我们只想找到一个位.
bool HasOnlyOneBit (int numb)
{
//return true if numb has only one bit (I.E. is equal to 1, 2, 4, 8, 16... Int.MinValue)
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*keD 43
return x == (x & -x);
Run Code Online (Sandbox Code Playgroud)
这个答案是有效的,因为设计了两个补码表示法.
首先,一个例子.假设我们有8位有符号整数.
00010000 = 16
11110000 = -16
Run Code Online (Sandbox Code Playgroud)
按位,将给你00010000
的结果,等于你的原始值!这样做的原因是因为在2的补码中否定时,首先反转所有的位,然后加1.你将有一堆零和一堆进位,直到一个位置到位.按位然后检查我们是否设置了正确的位.
如果数字不是2的幂:
00101010 = 42
& 11010110 = -42
----------
00000010 != 42
Run Code Online (Sandbox Code Playgroud)
您的结果仍然只有一位,但它与原始值不匹配.因此,您的原始值设置了多个位.
注意:此技术对0返回true,这可能是也可能不是.
bra*_*boy 25
这是一个着名的问题
(x & x-1) == 0
Run Code Online (Sandbox Code Playgroud)
来自Wiki的2的力量:这里
64 = 01000000 (x)
63 = 00111111 (x-1)
______________
& = 00000000 == 0
______________
Run Code Online (Sandbox Code Playgroud)
某些其他位为ON时的情况
18 = 00010010 (x)
17 = 00010001 (x-1)
______________
& = 00010000 != 0
______________
Run Code Online (Sandbox Code Playgroud)