检查2的权力数量

时间:2016-09-19 10:01:29

标签: algorithm math bit

我有一个数字X,我想检查一下2的权力数量? 对于Ex

N=7  ans is 2 , 2*2
N=20 ans is 4, 2*2*2*2

类似我想查看next power of 2

For Ex:
N=14 Ans=16

没有使用for循环,是否有任何Bit Hack? 就像我们有一个单行解决方案来检查它是否是2 X&(X-1)==0的幂,类似的那样?

2 个答案:

答案 0 :(得分:2)

GCC有一个名为__builtin_clz()的内置指令,它返回整数中前导零的数量。例如,假设一个32位int,表达式p = 32 - __builtin_clz(n)将告诉您存储整数n需要多少位,而1 << p将为您提供下一个最高功率2(当然,提供p <32)。

还有一些与longlong long整数一起使用的等效函数。

或者,math.h定义一个名为frexp()的函数,它返回双精度数的base-2指数。这可能效率较低,因为在将整数传递给此函数之前,必须将整数转换为双精度值。

答案 1 :(得分:0)

如果一个数字只有单个&#39; 1&#39;在其二进制值。例如,2 = 00000010,4 = 00000100,8 = 00001000,依此类推。所以你可以用no来计算它。其位值为1。如果count为1则数字为2的幂,反之亦然。

您可以从herehere获取帮助,以避免计数设置位的循环。

如果count不是1(意味着Value不是2的幂),则从MSB获取其第一个设置位的位置,并且将该值的下一个2值的值设置为仅在位置+ 1处设置位的值。例如,数字3 = 00000011.它从MSB的第一个设置位是第2位。因此,2号的下一个幂是仅在第3位置设置位的值。即00000100 = 4.