题目是 2.66 ,大致意思如下:
实现下面的函数:
int leftmost_one(unsigned x);
该函数返回 x 最左边的(高位) 1 的掩码,例如:x = 0xFF00 返回 0x8000,x = 0x6600 返回 0x4000。
题目要求只能使用位运算。
答案如下:
int leftmost_one(unsigned x){
x |= (x >> 16);
x |= (x >> 8);
x |= (x >> 4);
x |= (x >> 2);
x |= (x >> 1);
return x ^ (x >> 1);
}
我只推测出前面 5 行右移操作之后,x 变为从最左边的 1 到最右边全为 1 的形式(例如:0x6600 -> 0x7FFF )。

