我所追求的是我可以输入一个数字的东西,它将返回最高位.我确信这有一个简单的方法.下面是一个示例输出(左边是输入)
1 -> 1 2 -> 2 3 -> 2 4 -> 4 5 -> 4 6 -> 4 7 -> 4 8 -> 8 9 -> 8 ... 63 -> 32
erickson.. 83
来自Hacker's Delight:
int hibit(unsigned int n) { n |= (n >> 1); n |= (n >> 2); n |= (n >> 4); n |= (n >> 8); n |= (n >> 16); return n - (n >> 1); }
此版本用于32位整数,但逻辑可以扩展到64位或更高.
来自Hacker's Delight:
int hibit(unsigned int n) { n |= (n >> 1); n |= (n >> 2); n |= (n >> 4); n |= (n >> 8); n |= (n >> 16); return n - (n >> 1); }
此版本用于32位整数,但逻辑可以扩展到64位或更高.
fls
最底层的是许多架构的硬件指令.我怀疑这可能是最简单,最快速的方式.
1<<(fls(input)-1)
这应该可以解决问题.
int hob (int num) { if (!num) return 0; int ret = 1; while (num >>= 1) ret <<= 1; return ret; }
滚刀(1234)返回1024
滚刀(1024)返回1024
滚刀(1023)返回512
像混淆代码?试试这个:
1 <<(int)log2(x)
现有的库调用可以很容易地解决这个问题.
int highestBit(int v){ return fls(v) << 1; }
Linux手册页提供了有关此函数的更多详细信息以及其他输入类型的对应函数.