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

printk 2005-02-28 10:05:24
只用逻辑运算符
...全文
1045 35 打赏 收藏 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
hechunjiang 2005-03-31
  • 打赏
  • 举报
回复
算法中有很严重问题,只能判定正次幂,& | ^,如果只判定正次幂不如直接(n==0||n==1||(n%4==0))
inlin 2005-03-31
  • 打赏
  • 举报
回复
看看是不是2的循环倍数余数为0
inlin 2005-03-31
  • 打赏
  • 举报
回复
相除2
bulala 2005-03-31
  • 打赏
  • 举报
回复
用位左移,和位右移
tfq 2005-03-28
  • 打赏
  • 举报
回复
偷学
hyeena 2005-03-28
  • 打赏
  • 举报
回复
前段时间刚看见过,((~a + 0x01) & a == a)
番茄乌冬 2005-03-21
  • 打赏
  • 举报
回复
严重支持 pkd(晋江市FLYING技术部)

#define Mi_Of_2(a) (!(a & (a - 1)))是最好地!

to 海龙:
!是逻辑非,不是按位取反
hhoo 2005-03-19
  • 打赏
  • 举报
回复
↑
BillSmith 2005-03-19
  • 打赏
  • 举报
回复
若x&(x-1)==0那就是2的某次方。前提是整数哟!
baqiao1211 2005-03-18
  • 打赏
  • 举报
回复
mark
sankt 2005-03-18
  • 打赏
  • 举报
回复
学习
140355 2005-03-18
  • 打赏
  • 举报
回复
if((n>0)&&!(n^(!n)))
//和自己取反后的值异或后值为全1即可
qingyuan18 2005-03-18
  • 打赏
  • 举报
回复
Boolean Is2n(int i)
{
if(i>2)
{
return (Is2n(i/2));
}
else
{
if(i==2)
{
return true;
}
else
{
return false;
}
}
}
Kvci 2005-03-18
  • 打赏
  • 举报
回复
#define Is2n(a) (((~a+0x01)&a)==a)
main()
{
long i;
for(i=0;i<100000000;i++)
if Is2n(i) printf("\n%12.ld",i);
}
这也行
Kvci 2005-03-18
  • 打赏
  • 举报
回复
回复人: pcboyxhy(-273.15℃) ( ) 信誉:100
#define Is2n(a) (((~a+0x01)&a)==a)
void main()
{
int i;
for(i=0;i<10000;i++)
if Is2n(i) printf("\n%d",i);
}
searoom 2005-03-18
  • 打赏
  • 举报
回复
汗!

"!" 不时表示“非”么?
pkd 2005-03-01
  • 打赏
  • 举报
回复
TO : searoom(海龙)
请你再想一想“!”表示什么。
偶的算法是正确的,效率是最高的,扩展性是最好的。
#define Mi_Of_2(a) (!(a & (a - 1)))
walkonthesky 2005-03-01
  • 打赏
  • 举报
回复
从效率上讲,这个查表只需要做32次&操作
而其他的就难说了
walkonthesky 2005-03-01
  • 打赏
  • 举报
回复
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
11 2048
12 4096
13 8192
14 16384
15 32768
16 65536
17 131072
18 262144
19 524288
20 1048576
21 2097152
22 4194304
23 8388608
24 16777216
25 33554432
26 67108864
27 134217728
28 268435456
29 536870912
30 1073741824
31 2147387628
32 4294967296

楼上的所有算法都有INT溢出的可能
而这个问题最简单有效的办法就是查表
主要利用了幂级数扩散很快的特点

可以想象,一个INT的大小极限,只要32个表项就可以表示
64位整数是WINDOWS直接支持的最大范围,也只要64个表项表示
这种方法是最有效的




walkonthesky 2005-03-01
  • 打赏
  • 举报
回复
查表啊
最快了
加载更多回复(15)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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