社区
其它技术问题
帖子详情
如何判断一个数是否为2的某次方?
printk
2005-02-28 10:05:24
只用逻辑运算符
...全文
1045
35
打赏
收藏
如何判断一个数是否为2的某次方?
只用逻辑运算符
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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)
关于如何
判断
一个
数
是否
是2的整
数
次方
的问题
有这样的一道题: 有一串奇怪
数
列如下:1 2 -3 4 -5 -6 -7 8 -9 ... 即从1-n,碰到2的
次方
倍则显正,其他则是负
数
。(2的整
次方
包括:1,2,4,8,16,32,64,128,....) 现在给你
一个
n,求出,这个
数
列的和。 直接来
判断
一个
数
是不是2的整
数
次方
并不好
判断
,此时我们可以用位运算来快速解决。 我们把2的整
数
次方
的
数
化成
一个
二进制
数
,会发现,所有这样的二...
快速
判断
一个
数
是否
是2的幂
次方
,若是,并
判断
出来是多少
次方
!
将2的幂
次方
写成二进制形式后,很容易就会发现有
一个
特点:二进制中只有
一个
1,并且1后面跟了n个0; 因此问题可以转化为
判断
1后面
是否
跟了n个0就可以了。 如果将这个
数
减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的
数
与去减去1后的
数
字进行与运算后会发现为零。 最快速的方法: (number & number -
判断
一个
数
是否
是2的整
数
次方
题目描述: /*
判断
一个
数
是否
是2的整
数
次方
*/ 思路: 如果
一个
数
是2的整
数
次方
的话,那么它就只有
一个
1 代码示例: import java.util.Scanner; /*
判断
一个
数
是否
是2的整
数
次方
*/ public class Judge_Two { public static void main(String[] args) { Scanner in = new Scanner(System.in); int number = in.nextI
判断
一个
数
是否
是2的幂
数
,并且
判断
是多少
次方
代码如下: // Log2_1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; bool Is2(int num) { return !(num&(num-1)); } int log2(int value) { if (value==0) return
其它技术问题
3,881
社区成员
9,044
社区内容
发帖
与我相关
我的任务
其它技术问题
C/C++ 其它技术问题
复制链接
扫一扫
分享
社区描述
C/C++ 其它技术问题
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章