Знак расширяет 11 бит до 32 бит
Как подписать расширение 11-битного числа до 32-битного числа в C++?
У меня есть следующая функция, но она не возвращает правильное расширение знака, как ожидалось:
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 ответ
Поскольку сдвиги вправо и влево являются арифметическими в C++, вы можете сдвигать целое число вправо до наиболее значимого бита типа int, а затем назад:
std::int32_t i = 2047;
i = (i << 21) >> 21;
это ставит -1 к i