`
sharong
  • 浏览: 493432 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
D1667ae2-8cfc-3b68-ac7c-5e282789fa4a
论开源
浏览量:8720
7eb53364-fe48-371c-9623-887640be0185
Spring-data-j...
浏览量:13059
社区版块
存档分类
最新评论

高效判断一个数是否是2的幂次方

 
阅读更多
一个数是否是2的幂次方,比较常用的是递归和移位运算进行判断。递归算法的思想很简单,就是不断的模上2去判断。

如果一个数是2的幂,那么它的二进制表示中就只有一位1,例如:10000,1000,100等等。所以如果对数字1进行移位操作,总会在移到某个位的时候和这个数相等。这就是移位判断的思想。

下面给出实现的代码,在实现中,还采用了第三种方式,因为二进制表示的2的幂次方数中只有一个1,后面跟的是n个0; 因此问题可以转化为判断1后面是否跟了n个0。如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与上(&)减去1后的数字,结果为零。
      (num & num - 1) == 0
public class TwoPower {

	/**
	 * 递归算法实现
	 * 
	 * @param num
	 * @return
	 */
	static int is2Power(int num){
		if(num < 2)
			return -1;

		if(num == 2){
			return 1;
		}else if(num % 2 == 0){
			return is2Power(num / 2);
		}else
			return -1;
	}
	
	/**
	 * 位与判断,最快
	 * 
	 * @param num
	 * @return
	 */
	static int anotherIs2Power(int num) {
		if(num < 2)
			return -1;
		
		if((num & num - 1) == 0 )
			return 1;
		else
			return -1;
	}
	
	/**
	 * 移位判断
	 * 
	 * @param num
	 * @return
	 */
	static int binaryIs2Power(int num) {
		if(num < 2)
			return -1;
		
		int temp = 1;
		while (num > temp) {  
	        temp <<= 1;  
	    }  
	
		return temp == num ? 1 : -1; 
	}
	
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		for(int i = 0;i< 2000000 ; i = i + 2){
			if(is2Power(i) == 1){
				System.out.print(i + "  ");
			}
		}

		long end = System.currentTimeMillis();
		System.out.println("consume -> " + (end - start));
		
	}
}

分别运行上面的三种算法,在我的双核2.8GHz,2G内存的老机器上,
递归查找2000000以内2的幂次方的数字,实际执行100w次循环,时间是47ms;
移位运算查找2000000以内,实际执行100w次循环,时间是31ms;
而第三种位与运算查找2000000以内的方法,执行100w次循环,需要的时间仅仅是15ms。
1
0
分享到:
评论
3 楼 sharong 2013-12-20  
wangyang_cx 写道
  public static boolean isPowerOfTwo(long x) {
    return x > 0 & (x & (x - 1)) == 0;
  }

这个方法的返回值和我提供的不一样。另外,jdk5以后的版本,编译器会自动优化代码,这个方法和我的那个another的,最后编译器里面的字节码没有什么太大区别
2 楼 teasp 2013-12-20  
wangyang_cx 写道
  public static boolean isPowerOfTwo(long x) {
    return x > 0 & (x & (x - 1)) == 0;
  }

一楼充分证明了基础的重要性。
1 楼 wangyang_cx 2013-12-20  
  public static boolean isPowerOfTwo(long x) {
    return x > 0 & (x & (x - 1)) == 0;
  }

相关推荐

    C语言判断一个数是否是2的幂次方或4的幂次方

    在C语言中,判断一个数是否为2的幂次方或4的幂次方涉及到对数值的二进制表示的理解。2的幂次方在二进制表示中具有独特特征,只有一个1,位于二进制的最低位,其余位都是0。4的幂次方同样如此,但它更进一步,要求这...

    如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方?

    这是因为如果一个数是2的幂次方,那么它的二进制表示中除了最低位的1之外,其他位都是0,而减1操作会使最低位的1变成0,按位与运算的结果就是0。 2. **4的幂次方的检查**:既然4的幂次方也是2的幂次方,我们可以...

    C# 位运算 判断是否为2的N次幂

    接下来,我们将介绍如何使用位运算来检查一个数是否为2的幂。一种有效的方法是检查该数除以2的余数是否为0,直到除到0为止。在C#中,我们可以连续右移位来实现这个过程: ```csharp bool IsPowerOfTwo(int num) { ...

    如何判断一个数是否为2的幂次方?若是,并判断出来是多少次方?

    总结起来,判断一个数是否为2的幂次方,以及计算其指数,都可以通过位操作高效地完成。这两个问题不仅在理论上有价值,而且在实际编程中也有广泛的应用,例如在内存分配、数组划分、数据结构设计等方面。了解并熟练...

    一条语句判断整数a是否是2的整数幂

    在计算机科学领域,判断一个整数是否为2的整数幂是一个常见的问题,尤其是在算法设计、数据结构处理以及系统优化等方面。本篇文章将基于提供的标题、描述、标签和部分内容,详细解析如何通过一条C++语句来判断一个...

    Project1_水仙花数_自幂数_

    pow是C++标准库中的一个函数,位于头文件内,用于计算一个数的幂。当你提到"使用不了",可能有以下几种情况: 1. **未包含头文件**:确保在代码中包含了`&lt;cmath&gt;`,这是使用pow函数的前提。 2. **类型不匹配**:pow...

    素数检测算法

    它通过一系列的模幂运算检验一个数是否可能是素数,每次检验的概率错误率都是固定的。通过重复进行多次检验,可以将错误率降低到任意小的数值。 尽管目前没有已知的有效算法可以在多项式时间内准确判断任意一个大数...

    python-leetcode面试题解之第342题4的幂.zip

    在本压缩包中,我们关注的是一个Python编程相关的学习资源,特别针对LeetCode面试题解。...通过学习和实践,你不仅能掌握如何判断一个数是否为4的幂,还能了解到如何优化算法,提高解决问题的能力。

    Leetcode 326:3的幂

    题目要求编写一个函数 `isPowerOfThree`,接收一个整数 `n` 作为参数,判断这个整数是否可以表示为 3 的幂次方。例如,27 是 3 的幂(因为 \(27 = 3^3\)),而 45 不是。题目给出了几个示例输入和对应的正确输出,...

    21位水仙花数

    水仙花数(Narcissistic number)是指一个n位数,它的每个位上的数字的n次幂之和等于它本身的一个数。例如,153就是一个典型的3位水仙花数,因为1^3 + 5^3 + 3^3 = 153。 ### 二、21位水仙花数的理解 #### 1. 题目...

    汇编2次方的科学运算源码

    平方一个数可以视为一个数与自身相乘,所以只需两次乘法操作即可完成。 科学运算往往涉及复杂数学,比如对大数的处理、浮点运算和复数运算等。在汇编中,这些运算可能需要更复杂的算法和数据结构来实现。例如,对于...

    求素数的新方法

    在本文中,我们将探讨一种高效求解素数的新方法,以及两个相关的辅助算法,用于判断一个数是否为2的幂次方,以及计算一个数的二进制表示中1的个数。 首先,让我们看看高效求解素数的方法。传统的素数求解方法,如...

    手稿_V1.0101

    部分内容描述了一个判断一个整数是否为 4 的幂次方的问题。 这个问题的核心在于理解整数的二进制表示,并利用数学和位运算来快速检查这个条件。在给定的 C 代码中,`isPowerOfFour` 函数实现了这一功能。以下是详细...

    c语言水仙花数的具体介绍.doc

    要准确地判断一个数是否为水仙花数,可以按照以下步骤进行: 1. **确定位数**:首先确定待检测的正整数的位数N。 2. **遍历数列**:接着,从10的(N-1)次方开始到10的N次方减1进行遍历,分别计算每个数的每位数字的N...

    asp.net数字转换中文

    5. **幂次方相加**:描述中的“一个N的幂次方相加”可能是指在处理多位数时,可能会遇到需要将不同位数的幂次方结果相加的情况。例如,将数字1234拆分为1*10^3 + 2*10^2 + 3*10^1 + 4*10^0,然后将每个部分转换为...

    简单幂模源代码算法(容易看懂)

    基于这个思路,我们可以设计一个简单的幂模运算算法,分为两部分的乘积,如以下伪代码所示: 1. 初始化R为N,K为1,M为E除2的余数。 2. 当E大于1时,将E除以2,余数存入M。 3. 如果M等于1,更新K为R乘以K。 4. 更新...

    acm算法经典例题.doc

    在给定的样例中,2^2的末尾数字是4,2^3的末尾数字是8,2^4的末尾数字是6,可以看出2的幂次方末尾数字以2,4,8,6的顺序循环。因此,对于任意正整数b,只需要计算b对4取模的值,然后根据这个模值对应的幂次方末尾数字...

    [宫水三叶的刷题日记]:打表1

    - 试除法:用于判断一个数是否为特定数的幂次方。 - 数学分析:利用质数和倍数关系优化算法,例如找到3的最大小于int范围的幂。 - 预处理和查表:提高查询效率,避免循环和递归,如构建3的幂的集合。 3. Java编程...

    C、C++编程(二)

    这通过检查一个数与其减1后的按位与运算结果来实现。如果`a[i] & (a[i]-1)`的结果为0,则表明`a[i]`是2的幂次方。这是因为2的幂次方的二进制表示中只有一个1,而其余位都是0。当它减去1时,所有位都会翻转,然后进行...

    编程求x的n次方-用C语言程序设计:求x的n次方的函数 .pdf

    在C语言中,计算一个数的幂通常可以借助标准库函数`pow()`来完成。`pow()`函数位于`&lt;math.h&gt;`头文件中,它的基本语法是`double pow(double base, double exponent)`,用于计算底数`base`的指数`exponent`次方,并...

Global site tag (gtag.js) - Google Analytics