Знак расширяет 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

Другие вопросы по тегам