截断二进制数

时间:2013-07-22 01:01:45

标签: c++ binary bitwise-operators

我想在整数的二进制表示中的第一个非零数字之后截断每个数字。我还需要这个尽可能简单(没有函数或多行代码)。

例如:

// in c++
int int1=7,int2=12,int3=34;   //needs to work for any number

使用某种运算符(可能是按位组合?),我需要这些来给出以下值

int1 -> 4
int2 -> 8
int3 -> 32

以二进制方式截断是我唯一能想到的,所以我对任何想法持开放态度。

谢谢!

2 个答案:

答案 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的特殊情况。

这是demo on ideone