例题一

不使用额外变量,通过一个表达式判断整数n是否为2^x,不能使用循环语句。

思路

2^x = 2, 4, 8, 16 ... ,二进制形式为10, 100, 1000, 10000 ,如果n减1后和n做与运算答案为0,就说明它满足2^x

答案

!(n&(n-1))

例题二

f(729, 271)

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的和的一半

答案

500
最后修改:2018 年 12 月 16 日
如果觉得我的文章对你有用,请随意赞赏