符号扩展11位到32位

时间:2017-03-11 07:59:30

标签: c++ bit-manipulation sign-extension

如何签名在C ++中将11位数扩展为32位数?

我有以下功能,但它没有按预期返回正确的符号扩展名:

unsigned int signExtend11to32ui(int i) {
    int mask = 2047; // 0x7FF or 0000 0111 1111 1111
    return static_cast<unsigned int>(static_cast<int>(i & mask));
}

以下函数适用于16位到32位的符号扩展:

unsigned int signExtend16to32ui(short i) {
    return static_cast<unsigned int>(static_cast<int>(i));
}

1 个答案:

答案 0 :(得分:2)

由于左右移位是C ++中的算术运算,因此您可以将整数转换为int的最高位然后返回:

std::int32_t i = 2047;
i = (i << 21) >> 21;

这会将-1加到i