检查数字在signed int中是否只有一个位的创新方法

Mei*_*ude 29 algorithm byte

我正在寻找一种创新的方法来检查一个数字在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,这可能是也可能不是.

  • 你还需要测试`x> 0`,因为这个表达式对于`x == 0`返回true,但是0不是2的幂. (5认同)

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)

  • 对不起我的意思是当x = 0 - > x&(x - 1) - > 0时,所以不是假而是返回true! (2认同)

Kal*_*son 8

我建议你看一下Bit Twiddling Hacks页面,然后在" 确定一个整数是2的幂 "或" 计数位设置 " 下选择最合适的选项.