如何判断一个数是否为2的整数次幂

题目

实现一个方法,来判断一个正整数是否是2的整数次幂(如16是2的4次方,返回1;18不是2的整数次幂,则返回-1)。


法一

int isPowerOf2V1(int num) {
	int temp = 1;
	while (temp <= num) {
		if (temp == num) {
			return 1;
		}
		temp *= 2;
	}
	return -1;
}

创建一个中间变量temp,初始值是1。然后进入一个循环,每次循环都让temp和目标整数相比较,如果相等,则说明目标整数是2的整数次幂;如果不相等,则让temp增大一倍,继续循环并进行比较。当temp的值大于目标整数时,说明目标整数不是2的整数次幂。
例如,给出一个整数19,则
1×2=2,2×2=4,4×2=8,8×2=16,16×2=32,由于32>19,所以19不是2的整数次幂。
如果目标整数的大小是n,则此方法的时间复杂度是O(logn)。

优化一下

可以把之前乘以2的操作改成向左移位,移位的性能比乘法高得多。

int isPowerOf2V2(int num) {
	int temp = 1;
	while (temp <= num) {
		if (temp == num) {
			return 1;
		}
		temp <<= 1;
	}
}

这样确实有一定优化,但算法的时间复杂度仍是O(logn),本质上没有变。


法二

先把2的正整数次幂转换成二进制数,如下表

十进制二进制是否为2的整数次幂
81000B
1610000B
32100000B
641000000B
1001100100B

接下来如果把这些2的整数次幂各自减1

十进制二进制原数值-1是否为2的整数次幂
81000B111B
1610000B1111B
32100000B11111B
641000000B111111B
1001100100B1100011B

这时如果将原数值和它减1的结果进行按位与计算,也就是n&(n-1)

十进制二进制原数值-1n&n-1是否为2的整数次幂
81000B111B0
1610000B1111B0
32100000B11111B0
641000000B111111B0
1001100100B1100011B1

所以对于一个整数n,只需要计算n&(n-1)的结果是不是0就可以判断了。
时间复杂度为O(1)。

int isPowerOf2V3(int num) {
	return (num & num-1) == 0;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值