判断一个数是否为 2 的 某 次方

在计算机领域,2 有着特殊的地位。

现在给定一个数 n ,检验 n 是否为 2 的某次方。

最简单的方法当然是将 n 不断的 除以 2,如果 n 是 2 的次方,则最后能得到 商为 1。

稍作改良,可以用 移位来代替除以 2 ,因为移位直接在硬件操作,效率比做除法高。

具体代码如下:

	public static boolean isPower(int n){
		if(n < 1)
			return false;
		int i = 1;
		while(i <= n){
			if(i == n)
				return true;
			else
				i<<=1;
		}
		return false;
	}

时间复杂度为log n ,算是比较高效的。

但是还有更高效的算法:

充分利用二进制的位运算,如果一个数的二进制数表示只有一位是 1 ,那么这个数是 2 的某次方。

比如 n = 8 的二进制:  0000 1000;n = 16 的二进制 : 0001 0000  ......

那么 n-1 的二进制数的低位都是 1,即 7 的二进制 为 :0000 0111 ,   15 的二进制为 : 0000 1111.

可知此时 n  与 n-1 没有一位同时为 1。将 n 与 n-1 做与运算 n&(n-1),结果应当为 0 。具体代码:

	public static boolean isPower(int n){
		if(n < 1)
			return false;
		int m = n&(n-1);
		return m == 0;
	}

此时时间复杂度为 O(1),比前面的方法高效得多





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值