Если вы хотите просто инвертировать 32-битное число, вы можете использовать метод сдвига битов, который изолирует каждую область байтов с помощью битовых масок и логических AND
, а затем меняет эти байты на соответствующее количество сдвинутых битов. используя операторы сдвига битов >>
и <<
. Затем вы можете рекомбинировать биты, используя логический OR
следующим образом:
int temp = 0x12345678;
temp = ((0xFF & temp) << 24) | ((0xFF00 & temp) << 8) | ((0xFF0000 & temp) >> 8) |
((0xFF000000 & temp) >> 24));
Теперь вы получите окончательное значение в temp
из 0x78563412
.
Обновление: Хорошо, я просматриваю ваш код и отмечаю следующее:
- Размер
int
кажется, что вы хотите работать с бинарной цифрой, которую вы разместили, 32-битной ... так что ваша функция showBits
не циклически перебирает достаточное количество бит для отображения всего 32 -битное целое число Насколько я могу видеть прямо сейчас, он будет отображаться только до 16 младших битов. Поэтому вам необходимо четко определить, работаете ли вы на платформе, которая определяет int
как 16 или 32-бит.
- Ваши
reverse
функции неверны. Если у вас есть 32-битный int
, такой как 0x12345678
, и вы сдвигаете его влево на 8 бит, вы получите 0x34567800
. Точно так же, когда вы сдвинете его вправо на 8 бит, вы просто получите 0x00123456
. Сдвиг числа не приводит к повороту значений на их соответствующие позиции (то есть сдвиг влево на 8 битов не даст вам 0x34567812
). Кроме того, даже если это произойдет, логическое OR
повернутых значений все равно не будет правильным изменением значений. Вместо этого вы должны использовать метод, описанный выше, который использует битовые маски и логический AND
, чтобы изолировать каждый байт, а затем сдвинуть эти биты на соответствующее количество мест, чтобы обратить биты в 32-битное слово.