我想在整数的二进制表示中的第一个非零数字之后截断每个数字。我还需要这个尽可能简单(没有函数或多行代码)。
例如:
// in c++
int int1=7,int2=12,int3=34; //needs to work for any number
使用某种运算符(可能是按位组合?),我需要这些来给出以下值
int1 -> 4
int2 -> 8
int3 -> 32
以二进制方式截断是我唯一能想到的,所以我对任何想法持开放态度。
谢谢!
答案 0 :(得分:3)
此功能来自书籍Hacker's Delight
。
// greatest power of 2 less than or equal to n (floor pow2)
uint32_t flp2(uint32_t n)
{
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return n - (n >> 1);
}
我还可以发布相关的clp2
函数:
// least power of 2 greater than or equal to n (ceiling pow2)
uint32_t clp2(uint32_t n)
{
n -= 1;
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
return n + 1;
}
答案 1 :(得分:2)
可以使用pretty neat trick:
if ((v & (v - 1)) == 0) {
return v;
}
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
v >>= 1;
return v;
这个想法是在递减值之后将“OR
”放在顶部的所有值之后,然后在结尾处将值递增。我在最后添加了一个标准技巧,因为原始代码旨在找到大于或等于给定值的最小2^n
。
编辑:我还为2^N
添加了another trick from the same list的特殊情况。