例题一
不使用额外变量,通过一个表达式判断整数 n 是否为 2^x,不能使用循环语句。
思路
2^x
= 2, 4, 8, 16 ...
,二进制形式为 10, 100, 1000, 10000
,如果 n 减 1 后和 n 做与运算答案为 0,就说明它满足 2^x
。
答案
1 |
!(n&(n-1)) |
例题二
求 f(729, 271)
:
1 2 3 |
int f(int x, int y){ return (x&y) + ((x^y) >> 1); } |
思路
x&y 是相同的位与,等于 x 和 y 相同位的和的一半。 (x^y) 是取出 x 和 y 不同位,>>1
也相当于除以 2 。
所以整个表达式合起来就是 x 和 y 相同位的一半
加上 x 和 y 不同位的一半
——即 x 和 y 的和的一半
。
答案
1 |
500 |
评论