你写的表达式想判断的话还差点就是把后边的yes和no交换位置
即:x&(x-1)?"no":"yes";
位运算
这个其实并不难,
你听我说
几句:
首先来看几个数,这几个数不大,都是10以内的,我们看看它们对应的
二进制数
是啥
0——0
1——1
2——10
3——11
4——100
5——101
6——110
7——111
8——1000
9——1001
========================================================
就写这些吧,所谓“位”就是二进制数的个数。比如1是一位的,
2和3是两位的,4,5,6,7是三位的,9是四位的
位运算就是“按位进行的运算”,就是对说二进制的每一个“位”分别进行一种“运算”
位运算中没有什么加减乘除,只有
逻辑运算
,即“与,或,非,
异或
”等
在C语言中
“位与”的符号为&
“位或”为|
“位非”
为
~
“位异或”为^
规则是这样的:“与”是只有同为1时为1
“或”是只要有一个为1,结果就为1
,
非就是
取反
,1变0,0变1
。
异或为两数相同结果为0,两数不同结果为1
=========================================================
基础知识大概就这些,那来看看x&(x-1)
这个表达式为啥能判断是不是
2的幂
:
回过头先去观察一下
我上边写的几个数对应的二进制吧,
重点到1,2,4,8
它们都是2的整数
次幂
不难看出1是0位与1位的分界线
,
2
是
1位与2位的分界线
4
是
2位与3位的分界线
8
是
3位与4位的分界线
由此不难推出
2的整数次幂都是“分界线”。
分界线可好哟,这说明分界线的数
减去1后
它所对应的二进制数就少了1位
比如8(1000)
减去1,变成7(111)
,从4位变成3位了
为了把7凑成跟8一样的4个二进制位
,我们在前边补0
就是
7(0111)
此时,8&7
,进行位与运算,由于4个二进位都是1和0的与,结果为
0000
而8是2的整数次幂
,而x&(x-1)为0,
所以表达式x&(x-1)?"no":"yes";
应该取yes
这也证明了这个表达式的正确性。
===========================================================
楼主可自己拿7,6,5
试下
肯定结果不是0
因为它们的“位数”
相同
最高位又都是1
所以肯定结果中会有1的存在,结果不可能是0,所以
x&(x-1)?"no":"yes";
应该取得no
而4,2
它们运算后的结果和8一样,也是0.
综上,表达式x&(x-1)?"no":"yes";
可以判断x是否是一个2的幂
温馨提示:答案为网友推荐,仅供参考