判断一个数是否为2的幂

描述

判断一个数是否是2的幂。

二进制处理

如果一个数 n n n是2的幂,则 n n n毕竟是正整数,而且 n n n的二进制表示中有且仅有一个1。
因此,可以考虑使用位运算,将 n n n的二进制表示中最低位的那个1提取出来,再判断剩下的数值是否为0即可。
这里介绍两种常见的处理二进制表示中最低位的方法。

n & ( − n ) n \& (-n) n&(n)

其中 & \& &表示按位与运算。已知n是正整数,则 − n -n n 就是 n n n的相反数,为负数。这个方法可以直接获取 n n n二进制表示的最低位的1。
我们知道,负数在计算机中是以补码的形式存储的,则*-n的二进制表示为n*的二进制表示的反码(对二进制的每一位取反)加1,其原理如下:

假设 n n n的二进制表示为 ( a 1000 ) 2 (a1000)_2 (a1000)2 a a a表示若干个高位),则 − n -n n 的二进制表示为 ( a ˉ 0111 ) 2 + ( 1 ) 2 = ( a ˉ 1000 ) 2 (\bar{a}0111)_2 + (1)_2 = (\bar{a}1000)_2 (aˉ0111)2+(1)2=(aˉ1000)2,将 n n n − n -n n进行按位与运算后,高位全部变为0,最低位的1以及后面的所有0都不变,从而便可以获取 n n n的二进制表示的最低位的1。

因此,如果 n n n是正整数且 n & ( − n ) = n n \& (-n) = n n&(n)=n,则 n n n就是2的幂。

n & ( n − 1 ) n\&(n-1) n&(n1)

该方法可以直接将 n n n的二进制表示中最低位的1给移除掉,原理如下:

假设 n n n的二进制表示为 ( a 1000 ) 2 (a1000)_2 (a1000)2 a a a表示若干个高位),则 n − 1 n-1 n1 的二进制表示为 ( a 0111 ) 2 (a0111)_2 (a0111)2,将 n n n n − 1 n-1 n1进行按位与运算后,高位 a a a不变,而在这之后的所有位都变为0,从而将最低位的那个1移除了。

因此,如果 n n n是正整数且 n & ( n − 1 ) = 0 n\&(n-1)=0 n&(n1)=0,则 n n n就是2的幂。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值