接题目
/*Generate mask indicating leftmost 1 in x. Assume w =32
For example,0xFF00 -> 0x8000,and 0x6600 --> 0x4000.
If x = 0.then return 0.
*/
int leftmost_one(unsigned x);
就是要得到最高位为1的那一个比特的值
官方答案(已验证)
#include <stdio.h>
#include <assert.h>
/** Generate mask indicating leftmost 1 in x. Assume w=32
* For example, 0xFF00 -> 0x8000, and 0x6000 -> 0x4000.
* If x = 0, then return 0 */
int leftmost_one(unsigned x) {
/*
* first, generate a mask that all bits after leftmost one are one
* e.g. 0xFF00 -> 0xFFFF, and 0x6000 -> 0x7FFF
* If x = 0, get 0 */
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
/** then, do (mask >> 1) + (mask && 1), in which mask && 1 deals with case x = 0,
reserve leftmost bit one * that's we want */
return (x >> 1) + (x && 1);
}
int main(int argc, char* argv[]) {
assert(leftmost_one(0xFF00) == 0x8000);
assert(leftmost_one(0x6000) == 0x4000);
assert(leftmost_one(0x0) == 0x0);
assert(leftmost_one(0x80000000) == 0x80000000);
return 0;
}