判断一个数是2的n次幂的方法 : 2的n次幂的形式是10,100,1000,10000,……,所以
!(x & (x-1))为真即x为2的幂次。
观察4个幂次的二进制可以发现,形式为100,10000,1000000,……,
这个和上面的2的幂次一样,(x & (x -1) ) 一定是0,但是这还不够的,因为4的幂次后面的0是偶数个的,如果以4位一格看的话,即1的位置是在第1位和第三位,即0101的形式,所以x必须和5相与,如果是4的幂次和0x55555555相遇一定是大于0的。
bool fn(unsigned int x)
{
if ( x == 0 ) return false;
if ( x & (x - 1) ) return false;
return x & 0x55555555;
}
下面这个方法比较简单,首先是!(x(&x-1))判断,其次是4的幂次的末尾要么是4,要么是6。
!( x & (x - 1) ) && ( x%10 == 4 || x%10 == 6 )