从整数中检索最后6位

时间:2012-09-06 16:18:04

标签: c++ visual-c++

我需要获取整数或Uint32的最后6位。例如,如果我的值为183,那么我需要最后六位,即110 111,即55

我已经编写了一小段代码,但它没有按预期运行。你们能指出我犯错的地方吗?

int compress8bitTolessBit( int value_to_compress, int no_of_bits_to_compress )
{
    int ret = 0;
    while(no_of_bits_to_compress--)
    {
        std::cout << " the value of bits "<< no_of_bits_to_compress << std::endl;
        ret >>= 1;
        ret |= ( value_to_compress%2 );
        value_to_compress /= 2;
    }
    return ret;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int val = compress8bitTolessBit( 183, 5 );

    std::cout <<" the value is "<< val << std::endl;
      system("pause>nul");
    return 0;
}

5 个答案:

答案 0 :(得分:11)

您已进入二进制算术领域。 C ++有这种东西的内置运算符。使用“AND”二元运算符完成整数“获取某些位”的行为。

    0101 0101
AND 0000 1111
    ---------
    0000 0101

在C ++中,这是:

int n = 0x55 & 0xF;
// n = 0x5

所以要获得最右边的6位,

int n = original_value & 0x3F;

并获得最右边的N位,

int n = original_value & ((1 << N) - 1);

以下是有关

的更多信息

答案 1 :(得分:7)

我没有遇到问题,你不能只使用按位运算符吗?例如

u32 trimmed = value & 0x3F;

这将使用bitwise AND运算符仅保留6个最低有效位。

答案 2 :(得分:2)

TL; DR:

int val = x & 0x3F;

答案 3 :(得分:1)

int value = input & ((1 << (no_of_bits_to_compress + 1) - 1)

这个计算2的第(n + 1)次幂:1 << (no_of_bits_to_compress + 1)并减去1以获得设置了所有n位的掩码。

答案 4 :(得分:0)

整数A的最后k位。

1. A % (1<<k); // simply A % 2^k
2. A - ((A>>k)<<k); 

第一种方法使用的事实是,最后k位是对k次右对齐(除以2 ^ k)后进行修整的结果。

相关问题