Для чего 0x01 и 0x80 являются представительными в битовых операциях C?

Я пытаюсь инвертировать порядок битов в 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;
  }

Книга, из которой я работаю, не обсудила эти виды значений, таким образом, я не действительно уверен, что сделать из них. Кто-то может пролить некоторый свет на это решение?Спасибо!

5
задан Daniel Szabo 4 May 2019 в 17:02
поделиться

3 ответа

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)
4
ответ дан 14 December 2019 в 04:33
поделиться

0x01 означает 1 - один в разряде единиц - и 0x80 означает 128 - 8 в разряде шестнадцати. Эти числа относятся к младшему биту и старшему биту в восьмибитном числе соответственно. Их сдвиг дает маски для отдельных битов байта.

Изменить: В шестнадцатеричном числе цифры идут в степени шестнадцати, а не десяти. Итак, первая цифра справа - это разряд единиц (0x1 = 1), вторая цифра - разряд шестнадцати (0x10 = 16), третья цифра - разряд двести пятьдесят шестерок (0x100 = 256) и скоро.

0
ответ дан 14 December 2019 в 04:33
поделиться

Каждая шестнадцатеричная цифра представляет 4 бита, поэтому

  • 0x01 - это просто длинный способ записи 1.
  • 0x80 - короткий способ записи в двоичном формате [1000] [0000], или 128.

Решение заключается в использовании поразрядных операторов для проверки и установки значений.

Выражение:

if (a & b) { ... }

выполняет '...', если один и тот же бит равен 1 как в 'a', так и в 'b'.

Выражение

c |= b

устанавливает биты в 'c' в 1, если они равны 1 в 'b'.

Цикл перемещает бит проверки и установки вниз по строке.

Удачи!

3
ответ дан 14 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: