3

我需要获取整数或 Uint32 的最后 6 位。例如,如果我的值为 183,我需要最后六位,110 111即 ie 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;
}
4

5 回答 5

16

您已进入二进制算术领域。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);

这里有更多信息

于 2012-09-06T16:23:06.240 回答
7

我不明白这个问题,你不能只使用按位运算符吗?例如

u32 trimmed = value & 0x3F;

这将通过使用按位与运算符仅保留 6 个最低有效位。

于 2012-09-06T16:20:04.410 回答
2

tl;博士:

int val = x & 0x3F;
于 2012-09-06T16:19:45.773 回答
2
int value = input & ((1 << (no_of_bits_to_compress + 1) - 1)

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

于 2012-09-06T16:21:27.693 回答
1

整数 A 的最后 k 位。

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

第一种方法使用的事实是最后 k 位是在执行 k 次正确操作(除以 2^k)之后修剪的内容。

于 2019-01-13T10:13:18.543 回答