如何判断一个数是2的N次方?小鸟寻求高手帮组

m2168zeng 2009-07-19 03:08:54
如何判断一个数是2的N次方?小鸟寻求高手帮组~~!!
我是个初学者 大家帮忙下。。。。。
3Q~~
...全文
580 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
BYD123 2012-08-25
  • 打赏
  • 举报
回复
1)由于2的N次方的数二进制表示是第1位为1,其余为0,而x-1(假如x为2的N次方)得到的数的二进制表示恰恰是第1位为0,其余为1,两者相与,得到的结果就为0,否则结果肯定不为0。
2)代码:
 return ((num & (num - 1)) == 0) ? true : false;
ouwaner 2010-06-21
  • 打赏
  • 举报
回复
/**
* 找不到最快的最好的,我是这样做的 [简要说明] 判断一个数是否是2的n次幂 [详细说明]
* 判断一个数是否是2的n次幂,如果是返回ture,如果不是返回false
*
* @param num
* @return
*/
public boolean judgePower(int num) {
if (num < 1)
return false;
while (num > 2) {
if (num % 2 == 1)
return false;
else
num = num / 2;
}
return true;
}

public void testNegative(){
assertFalse(judgePower(-1));
}

public void testZero(){
assertFalse(judgePower(0));
}

public void testTrue(){
assertTrue(judgePower(1));
assertTrue(judgePower(2));
assertTrue(judgePower(4));
assertTrue(judgePower(8));
assertTrue(judgePower(16));
assertTrue(judgePower(32));
}

public void testF(){
assertFalse(judgePower(3));
assertFalse(judgePower(5));
assertFalse(judgePower(6));
assertFalse(judgePower(7));
assertFalse(judgePower(9));
assertFalse(judgePower(10));
}
linhui9010 2009-07-19
  • 打赏
  • 举报
回复
七楼的好像有问题吧 是2的n次方 不是2的倍数 我是菜鸟 呵呵 不晓得说的对不
yue_hun 2009-07-19
  • 打赏
  • 举报
回复

/**
* [简要说明] 判断一个数是否是2的n次幂
* [详细说明] 判断一个数是否是2的n次幂,如果是返回ture,如果不是返回false
* @param num
* @return
*/
public boolean judgePower (int num)
{
if (num%2 == 0 && num != 0)
{
return true;
}

return false;
}



yue_hun 2009-07-19
  • 打赏
  • 举报
回复
/**
* [简要说明] 判断一个数是否是2的n次幂
* [详细说明] 判断一个数是否是2的n次幂,如果是返回ture,如果不是返回false
* @param num
* @return
*/
public boolean judgePower (int num)
{
if (num%2 == 0 && num != 0)
{
return true;
}

return false;
}
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 preferme 的回复:]
引用 4 楼 zisheng 的回复:
(i & (i - 1)) == 0

4楼正解。
正整数都成立。short、int、long类型都可以。
[/Quote]

这种算法的复杂度应该是 O(1) 吧,呵呵。
virus7581 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 goldenfish1919 的回复:]
if( n & (n-1) ==0 )return true;
return false;
[/Quote]
充分利用了二进制和按位运算,学习了
clarck_913 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zisheng 的回复:]
引用 4 楼 zisheng 的回复:
(i & (i - 1)) == 0

因为2的N次方都是例如:
010000,00100,00010,仅包含一个1.
但是这个000001得除外,
[/Quote]

这个牛~

clarck_913 2009-07-19
  • 打赏
  • 举报
回复

//N是负数的情况我没考虑
public static boolean check(int n){
boolean flag = false;
int i = 2;
if((i >> 1) == n){
flag = true;
}else{
while(i <= n){
if(i == n){
flag = true;
break;
}
i = i << 1;
}
}

return flag;
}


冰思雨 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zisheng 的回复:]
(i & (i - 1)) == 0
[/Quote]
4楼正解。
正整数都成立。short、int、long类型都可以。
chenql175 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zisheng 的回复:]
(i & (i - 1)) == 0
[/Quote]

i是什么类型的,怎具体怎么写啊?我用scanner写怎么都不对啊?
chenql175 2009-07-19
  • 打赏
  • 举报
回复
import java.util.*;
public class PanDuan {
public static double JiSuan(double n)
{
double x;
x = n/2;
if(x>=3)
x = JiSuan(x);
return (x);
}
public static void main(String[] args)
{
double m,y;
System.out.println("请输入所需判断的数字:");
Scanner reader = new Scanner(System.in);
m = reader.nextDouble();
if(m == 2)
System.out.println("该数是2的n次方");
else
{
y = JiSuan(m);
if(y == 2)
System.out.println("该数是2的n次方");
else
System.out.println("该数不是2的n次方");
}
}
}
ZiSheng 2009-07-19
  • 打赏
  • 举报
回复
错了,1也对,是2的0次幂,呵呵
ZiSheng 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zisheng 的回复:]
(i & (i - 1)) == 0
[/Quote]
因为2的N次方都是例如:
010000,00100,00010,仅包含一个1.
但是这个000001得除外,
ZiSheng 2009-07-19
  • 打赏
  • 举报
回复
(i & (i - 1)) == 0
若鱼1919 2009-07-19
  • 打赏
  • 举报
回复
if( n & (n-1) ==0 )return true;
return false;
m2168zeng 2009-07-19
  • 打赏
  • 举报
回复
谢谢大家的帮助 对我很有用3Q3Q3Q3Q3Q~~~
qingyunzhuimeng 2009-07-19
  • 打赏
  • 举报
回复
(0,1自己判断一下就可以了 ,这种写法可以提高鉴别效率,减少时间。时间复杂度应该是:log(n))
int n = 122;
int iTemp = n;
boolean bFlg = true;
for (int i = 1; i <= n / 2; i*2){
if (iTemp%2 == 1) {
bFlg = false;
break;
} else {
iTemp = iTemp / 2;
}
}
你试试吧
putersham 2009-07-19
  • 打赏
  • 举报
回复
$a = 122;
for($i=2;$i<=$a;$i=$i*2)
{
if ($a==$i) echo "yes";
}
java1109 2009-07-19
  • 打赏
  • 举报
回复
长见识了

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧