Я пытаюсь инвертировать порядок битов в C (вопрос о домашней работе, предмет: побитовые операторы). Я нашел это решение, но я немного смущен шестнадцатеричными используемыми значениями - 0x01 и 0x80.
unsigned char reverse(unsigned char c) {
int shift;
unsigned char result = 0;
for (shift = 0; shift < CHAR_BITS; shift++) {
if (c & (0x01 << shift))
result |= (0x80 >> shift);
}
return result;
}
Книга, из которой я работаю, не обсудила эти виды значений, таким образом, я не действительно уверен, что сделать из них. Кто-то может пролить некоторый свет на это решение?Спасибо!
0x01 - это самый младший битовый набор, следовательно, десятичное значение равно 1.
0x80 - самый старший бит из 8-битного набора байтов. Если он хранится в виде знака со знаком (на машине, которая использует нотацию с дополнением до 2 - как и большинство машин, с которыми вы, вероятно, столкнетесь), это самое отрицательное значение (десятичное -128); в беззнаковом символе - это десятичное число +128.
Другой шаблон, который становится второй натурой, - это 0xFF со всеми установленными битами; это десятичное число -1 для знаков со знаком и 255 для знаков без знака. И, конечно же, есть 0x00 или ноль без установленных битов.
В первом цикле цикл проверяет, установлен ли LSB (младший значащий бит), и, если он установлен, устанавливает MSB (самый старший бит) в результате. В следующем цикле он проверяет следующий за LSB и устанавливает следующий за MSB и т. Д.
| MSB | | | | | | | LSB |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | Input
| 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | Output
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x80
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0x01
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | (0x80 >> 1)
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | (0x01 << 1)
0x01
означает 1 - один в разряде единиц - и 0x80
означает 128 - 8 в разряде шестнадцати. Эти числа относятся к младшему биту и старшему биту в восьмибитном числе соответственно. Их сдвиг дает маски для отдельных битов байта.
Изменить: В шестнадцатеричном числе цифры идут в степени шестнадцати, а не десяти. Итак, первая цифра справа - это разряд единиц (0x1 = 1), вторая цифра - разряд шестнадцати (0x10 = 16), третья цифра - разряд двести пятьдесят шестерок (0x100 = 256) и скоро.
Каждая шестнадцатеричная цифра представляет 4 бита, поэтому
Решение заключается в использовании поразрядных операторов для проверки и установки значений.
Выражение:
if (a & b) { ... }
выполняет '...', если один и тот же бит равен 1 как в 'a', так и в 'b'.
Выражение
c |= b
устанавливает биты в 'c' в 1, если они равны 1 в 'b'.
Цикл перемещает бит проверки и установки вниз по строке.
Удачи!