+ -
当前位置:首页 → 问答吧 → 有表达式可以判断出一个数是2的n次方?

有表达式可以判断出一个数是2的n次方?

时间:2010-07-26

来源:互联网

妈的想了半天没有想出来, 据某人信心满满的说有, 让我很受打击。

作者: zylthinking   发布时间: 2010-07-26

n & (n-1) == 0

作者: bruceteen   发布时间: 2010-07-26

判断 位?

作者: donglongchao   发布时间: 2010-07-26



QUOTE:
n & (n-1) == 0
bruceteen 发表于 2010-07-26 11:56


正解,UP

作者: davelv   发布时间: 2010-07-26

果然, 谢谢, 去面壁了

作者: zylthinking   发布时间: 2010-07-26

不是求出一个数是2的N次方中的N是几啊?

作者: zhangsuozhu   发布时间: 2010-07-26

程序= 算法 + 数据结构,算法很重要。

作者: mirnshi   发布时间: 2010-07-26

无解吧

6符合
6&(6-1)==0

想想看N^(N-1)行不行

作者: folklore   发布时间: 2010-07-26



QUOTE:
无解吧

6符合
6&(6-1)==0

想想看N^(N-1)行不行
folklore 发表于 2010-07-26 12:19



110
101
-----
100

作者: mirnshi   发布时间: 2010-07-26

6咋符合啊?

作者: zhangsuozhu   发布时间: 2010-07-26

2的n次方,必然是
10..0
n-1,必然是
1...1

所以n & (n - 1) === 0

作者: mirnshi   发布时间: 2010-07-26

2的n次方的2进制:

1  00000010
2  00000100
3  00001000
4  00010000
5  00100000
6  01000000
7  10000000

作者: zhaohongjian000   发布时间: 2010-07-26

又學了一招啊.

作者: pandaiam   发布时间: 2010-07-26

n&(n-1)MS确实可以
原因:
奇数时:
n:Bit0为1
n-1:Bit0为0,其余位不变
可行

偶数时:
n-1将只改变从Bit0到Bit{从Bit0开始,值为0的所有Bit}为1,同时将第一个非0Bit置为0

确识可行

作者: folklore   发布时间: 2010-07-26



QUOTE:
2的n次方,必然是
10..0
n-1,必然是
1...1

所以n & (n - 1) === 0
mirnshi 发表于 2010-07-26 12:23



这个结论是对的,但不能排除别的数符合这个条件担不是2的n次方。

作者: zhaohongjian000   发布时间: 2010-07-26



QUOTE:
这个结论是对的,但不能排除别的数符合这个条件担不是2的n次方。
zhaohongjian000 发表于 2010-07-26 12:29



例如......?

作者: mirnshi   发布时间: 2010-07-26

回复 zhaohongjian000


    这就是数学中常说的充分与必要条件吧。

作者: ecjtubaowp   发布时间: 2010-07-26

恩,试了一下,11楼是对的,我举不出反例,先吃饭,吃完在讨论。

作者: zhaohongjian000   发布时间: 2010-07-26

数学归纳法,很快吧

作者: tinysniper   发布时间: 2010-07-26

想了一下,应该是这样:

如果一个数的二进制中有两个或以上的位不为0,那么减1的话高位的1是不会变成0的,这样按位或结果一定不是0。

作者: zhaohongjian000   发布时间: 2010-07-26

#define IS_2EXP(n)     ((n ^ (n - 1)) >= n)
原理:只有当 n 的位序列中仅存在一个 1 的时候,才可能使 [(n - 1) XOR n] >= n

测试了 [1, 1024] 的整数,以及 0, 2147483648, 4294967296 等边界条件,均可以正常判断。

作者: langue   发布时间: 2010-07-26

本帖最后由 zylthinking 于 2010-07-26 13:28 编辑


QUOTE:
#define IS_2EXP(n)     ((n ^ (n - 1)) >= n)
原理:只有当 n 的位序列中仅存在一个 1 的时候,才可能使  ...
langue 发表于 2010-07-26 13:09




恩, 原理相同, 但很显然比2楼的表达式更难懂一些, 而且, 似乎没有 ((n ^ (n - 1)) == n) 的情况

作者: zylthinking   发布时间: 2010-07-26

>> 似乎没有 ((n ^ (n - 1)) == n) 的情况

令 n := 1,
可知 [n ^ (n - 1)] = 1
因此 (n ^ (n - 1)) == n

不过确实考虑复杂了。

作者: langue   发布时间: 2010-07-26

mark下。。以后用得着

作者: xiboboy   发布时间: 2010-07-26