判断一个无符号数是否是2的n次幂形式的数

时间:2023-01-12 15:13:02
这是面试中问到的问题。可以先分析一下2的n次幂形式的数,其二进制形式必然是只有1bit是1,其余bit位都是0
因此一个直观的做法就是跟所有2的n次幂比较,由于我们通常考虑的无符号整型是32位,因此就有32个2的n次幂的数(可以通过将1左移0到31位得到)。这种方法在最坏情况下需要移位并比较32次,效率比较低。
再仔细分析一下可以发现,2的n次幂形式的数,其二进制形式为0...010...0,假设1后面有i个0 (0<=i<=31),则这个数减去1就会出现一个末尾连续i个1的数。例如二进制数0100,这个数减去1等于0011,这两个数的与为0
因此,一个更优的算法是:
判断一个无符号数是否是2的n次幂形式的数inline  bool  is2n(unsigned  int  i)
判断一个无符号数是否是2的n次幂形式的数判断一个无符号数是否是2的n次幂形式的数
... {
判断一个无符号数是否是2的n次幂形式的数    
if(i==0return false;    
判断一个无符号数是否是2的n次幂形式的数    
else return (i&(i-1))==0;
判断一个无符号数是否是2的n次幂形式的数}