判断一个是值是否是2的幂在3D游戏中常用函数
以往的判断方法是循环判断位或者直接一直循环除2.
这些方法的效率可想而知.
这里我用了一种直接位操作进行,效率看代码就知道.先看代码:
- bool Is2Power(int n)
- {
- if (n == 1)
- return false;
- if ((((~n)&(n-1))+1) == n)
- return true;
- return false;
- }
解释一下(以n=512为例):
1.尺寸1不是2的幂
2.对 n 取反(~n)结果是 0xfffffdff , 说明512的最高位为0,其它位为1
3.n-1 结果是 0x000001ff , 说明512的最高位及最高位更高的位都为0,其它位为1
4.所有2的幂的值都是最高位为1其它位为0
结果我们发现 n-1 的结果就是我们想到得到该值有效位值
这样我们计算 ((~n)&(n-1)) 后得到了一个没有最高位的值,也就是(n-1)=512-1=511
因此我们再将511+1就得到了一个与该值相等的新值.
而且该新值就等于原值
再测试一下n=500
~n结果是 0xfffffe0b, 最高位为0,其它位不一定为1
n-1结果是 0x000001f3, 最高位及最高位更高的位都为0, 其它位不一定为1
((~n)&(n-1)) 得到的结果就不是我们想到的499,而是一个按位与出来的结果.
所以不等于原值.
至此,经过测试该函数达到了我们想到的判断该值是否是2的幂效果.
怎么样,去试试吧.