位运算---2、3、4的幂

2的幂——即数字按位展开只有一位为1,所以 num&(num - 1) ==0;

return (n>0)&&((n&(n-1))==0)

 

4的幂——相较于2的幂而言对二进制位要求更高,不仅要求数字按位展开只有一位为1,且1的后面必须有偶数个0,即…00000100,…00010000,…01000000。

法一:
(num-1)后必然是三的倍数:

return  ((num & (num - 1)) == 0) && ((num - 1) % 3 == 0);

 

法二,既然已规定32位,那么只有将所有的4的幂的位置上置1——即0x…101010101010101(0x55555555)与num相与为num本身即可;

return (num >0)&&((num & (num - 1)) == 0) && ((num & 0x55555555) == num);

 

法三:由幂的定义出发:利用换低公式 x = log4(num )(以4为底),x为整数即可。

return (num > 0) && (Math.ceil(Math.log10(num) / Math.log10(4)) - Math.log10(num) / Math.log10(4) == 0);

 

 

3的幂——由幂的定义出发:利用换低公式x = log3(num )(以3为底),x为整数即可;或者Math.pow(log3(num)) == num即可

return (n > 0) &&(Math.pow(3,Math.round((Math.log(n)/Math.log(3))))==n);

 

posted @ 2020-02-21 18:10  dnoyeb  阅读(473)  评论(0编辑  收藏  举报