题目是 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 )。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.