求一c语言语句

来源:百度知道 编辑:UC知道 时间:2024/05/27 04:17:47
用一条语句判断一个数是否是2的次方

不知道

如果连负数都算上就不好说了

用一行代码判断一个数是否是2的次方
悬赏分:0 - 解决时间:2007-12-2 10:17
1、if(n && ((n & (~n + 1)) == n))

2、if(n && !(n & (n - 1)))
谁能解释一下 我看不懂!~n是什么意思?

很简单,2个语句意思都一样,就来看第2个
if(n && !(n & (n - 1)))
判断分2部分,前面一个条件n很简单,就是说n!=0,下面!(n & (n - 1))
先分开来里面的n&(n-1),如果n是2的次方,2进制必然是1000这样1后面N个0,那n-1就必然是0111这样0后面连续几个1,这样2个按位与必然全是0000,然后!取反变成1,就是true,条件就符合了

if (log(fabs(x))%log(2)==0)
printf("x是2的次方");

因为在数学中logab=logb/loga,2的n次方如果等于x的话可以写成
上述的那个表达式if中的表达式
不知道你明白否

2的n次访最高位为1
20 1
21 10
22 100
23 1000
判断最高位为1且其它位为0

if(n && ((n & (~n + 1)) == n))

负数-1 有可能也是这样的 因此还要加上 && n>0