什么是最有效的方法来确定一个数字是2的幂?

时间:2013-09-09 00:41:38

标签: java performance math recursion binary

只是一个简单的布尔真/假非常有效会很好。我应该使用递归,还是有更好的方法来确定它?

3 个答案:

答案 0 :(得分:13)

来自here

  

确定整数是2的幂

unsigned int v; // we want to see if v is a power of 2
bool f;         // the result goes here 

f = (v & (v - 1)) == 0;
     

请注意,此处0被错误地视为2的幂。要补救   这个,使用:

f = v && !(v & (v - 1));

为什么这样做?只有两个整数幂才能设置一个位。减1会产生将该位更改为零并将其下方的所有位更改为1的效果。使用原始数字AND将始终导致全部为零。

答案 1 :(得分:3)

2的整数幂为1,后跟一个或多个零

     Value          value -1 (binary)
   10      2              1
   100     4             11 
   1000    8            111 
   10000  16           1111 

mitch 表示

  (value & (value-1)) == 0

是2的幂时(但除了1/0之外的任何其他数字都没有,1通常被视为2加权到零的幂)。

对于mitch的解决方案,其中数字> 0不是2的幂,即

    value              value - 1       V & (v-1)
   1000001             1000000         1000000
   1000010             1000001         1000000
   1000100             1000011         1000000
   1001000             1000111         1000000

   1000011             1000010         1000010
   1000101             1000100         1000100
   1000111             1000110         1000110

永远不会为零。

从数字中减去1将位向上反转,包括第1位;因为两个人的权力只有一个'1'所以价值& (值-1)== 0,对于其他数字,第二个和后续的1不受影响。

需要排除零


另一种可能的解决方案(可能稍慢)是

   A & (-A) == A


Powers of 2:
     A      -A 
   00001 & 11111 = 00001
   00010 & 11110 = 00010
   00100 & 11100 = 00100

其他一些数字:

     A      -A 
   00011 & 11101 = 00001
   00101 & 11011 = 00001

你需要再次排除0


为了解决这个问题,我做了

  1. 以二进制形式写出数字;你会看到2的幂只有一个
  2. 在布尔级别处理各种运算符/布尔值并查看哪些有效
  3. 这样做,我发现以下内容也有效:

      A & (-A) == A        
     (not A) | (not A + 1) == -1    /* boolean not of a & (a-1) == 0 */
    

答案 2 :(得分:-1)

不确定您的计算速度或代码行方面是否有效。但你可以试试value == Integer.highestOneBit(value)。如果需要,请不要忘记排除零。