Не могу понять побитовые операции - PullRequest
0 голосов
/ 29 февраля 2020

Читая книгу K & R, я наткнулся на главу 2.9, в которой описаны побитовые операторы в C. В самом начале есть утверждение:

Битовый оператор AND & часто используется для маскирования некоторого набора битов, например, n = n & 0177; устанавливает в ноль все, кроме младших 7 битов n.

Я немного запутался с его истинным значением. Как шестнадцатеричный (если я правильно понял) 0177 представляет младшие 7 бит? Я попытался проверить это в коде, и ниже я сделал следующее:

#include <stdio.h>

int main()
{
    int n = 1490;
    n = n & 0177;
    printf("%i\n", n);
}

Вывод кода составляет 82. Преобразование 1490 в двоичное Я получил 10111010010 и после установки всех битов в ноль, кроме 7 младших разрядов биты я закончил с 1010010, который действительно равен 82 в десятичном виде. Пытаясь понять логи c под капотом, я применил оператор & (AND) вручную, но это привело к совершенно другому числу. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 29 февраля 2020

Обратите внимание, что 0177 является не шестнадцатеричным, а восьмеричной двоичной формой 01111111. Каждый восьмеричный di git представляет 3 бита, а ведущий 0 указывает компилятору интерпретировать его таким образом.

Итак, операция

decimal 1490    10111010010
octal   0177    00001111111
            AND -----------
decimal 82      00001010010
0 голосов
/ 29 февраля 2020

Компилятор интерпретирует префикс 0 как основание 8.

Итак, 177 (8) = 127 (10) = 1111111 (2).

Это ваши 7 битов.

0 голосов
/ 29 февраля 2020
 n & 0177

Во-первых, обратите внимание, что 0177 является восьмеричным входом, аналог двоичного 1111111 = 127 в десятичном виде.

Но когда вы делаете n & что-то, применяются продвижения аргументов по умолчанию, и 127 преобразуется к типу n, что означает, что он конвертируется во что-то вроде 0000000 0000000 0000000 01111111 - предполагая, что sizeof(typeof(n)) = 4.

Таким образом, n & 0177 будет конвертировано в число, которое сохраняет 1 только на самом низком 7 битов, где n было 1.

Позаботьтесь и о случае, когда речь идет о бигендии и лондонах.

...