用最快的方法判断一个数是否2的n次方
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用最快的方法判断一个数是否2的n次方相关的知识,希望对你有一定的参考价值。
用最快的方法判断一个数是不是2的n次方例如: 2、4、8、16、32.............等。本人想到一个最笨的办法:[mw_shl_code=java,true]boolean check(int a) boolean flag = false; int temp = 2; while (true) temp = temp * 2; if (temp == a ) flag = true; break; else if(temp > a) break; return flag; [/mw_shl_code]同学想到一个很高效的办法:[mw_shl_code=java,true]boolean check(int a) return (a&(a-1)) == 0?true:false;[/mw_shl_code]求讨论。。。。。。。。。。。
如果一个数是2^n,说明这个二进制里面只有一个1。 a = (10000)ba-1 = (01111)ba&(a-1) = 0。如果一个数不是2^n,说明它的二进制里含有多一个1。 a = (1xxx100)ba-1=(1xxx011)b那么 a&(a-1)就是 (1xxx000)b,而不会为0。所以可以用这种方法判断一个数是不2^n。 参考技术A 这个题目更类似是脑筋急转弯了,如楼上两位所言,用二进制表数,只有只有一个1即可 参考技术B 如何判断一个数是不是2的n次幂将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0;
因此问题可以转化为判断1后面是否跟了n个0就可以了。 参考技术C n&(n-1) == 0即可
位运算判断一个数是否为2的n次方
1 import java.util.Scanner; 2 3 /** 4 * 功能:用位运算,判断一个数是否为2的n次方。 5 * 思路:用1做移位操作,然后判断移位后的值是否与给定的数相同。 6 */ 7 public class Main3 { 8 9 public boolean isPower(int n) { 10 11 if (n < 1) { 12 return false; 13 } 14 15 int m = 1; 16 while (m < n) { 17 m = m << 1; 18 } 19 20 if (m == n) { 21 return true; 22 } 23 24 return false; 25 } 26 27 public static void main(String[] args) { 28 29 Scanner scanner = new Scanner(System.in); 30 Main3 main3 = new Main3(); 31 32 while (scanner.hasNext()) { 33 34 int n = scanner.nextInt(); 35 System.out.println(main3.isPower(n)); 36 } 37 } 38 }
以上是关于用最快的方法判断一个数是否2的n次方的主要内容,如果未能解决你的问题,请参考以下文章