如何高性能地判断一个整数是否为2的整数次幂?

53 篇文章 0 订阅
31 篇文章 0 订阅

预备知识:

按位与&的运算

&是二进制“与”运算,参加运算的两个数的二进制按位进行运算,运算的规律是:
0 & 0=0
0 & 1=0
1 & 0=0
1 & 1=1
对于参加运算的数要换算为二进制进行运算,例如7 & 2的结果是2,过程如下:
7 & 2
=0111 & 0010
=0010
=2

即 &:按位与运算,两个当且仅当都为1的时候结果才为1,即
1&1 == 1,
1&0 == 0, 
0&1 == 0,  
0&0 == 0
 

参考:程序员小灰

参考2:漫画算法:判断2的乘方

package chapter5.part5;

import org.junit.Test;

public class PowerOf2Test {
	
	@Test
	public void testPowerOf2() {
		boolean result = isPowerOf2(8);
		boolean result2 = isPowerOf2V2(8);
		boolean result3 = isPowerOf2V3(8);
		System.out.println("------老实乖巧版--------");
		System.out.println("结果: " + result);
		System.out.println("------移位运算版--------");
		System.out.println("结果: " + result2);
		System.out.println("------位运算妙用版--------");
		System.out.println("结果: " + result3);
	}

	//老实版
	private boolean isPowerOf2(int num) {
		int temp = 1;
		while(temp<=num) {
			if(temp == num) {
				return true;
			}
			temp = temp*2;
		}
		return false;
	}
	
	//提高性能版,将乘以2改为向左移位
	private boolean isPowerOf2V2(int num) {
		int temp = 1;
		while(temp <= num) {
			if(temp == num) {
				return true;
			}
			temp = temp<<1;
		}
		return false;
	}
	
	/*
	 * 巧妙运用位运算
	  n和(n-1)的与运算
	 */
	
	private boolean isPowerOf2V3(int num) {
		return (num&(num-1)) == 0;
	}

}

测试用例:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方文艺复兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值