Как этот побитовый оператор И маскирует младшие семь битов заказа числа?

Я читаю "Язык программирования C" Брайана Кернигана и Денниса Ричи. Вот что он говорит о побитом операторе AND:

Побитовый оператор AND & часто используется для маскировки некоторого набора битов, например

    n = n & 0177 

устанавливает ноль все, кроме 7 разрядов младшего порядка n.

Я не совсем понимаю, как он маскирует младшие семь битов заказа n. Может кто-нибудь уточнить?

Ответы

Ответ 1

Число 0177 - это восьмеричное число, представляющее двоичный рисунок ниже:

0000000001111111

Когда вы AND используете побитовое действие &, результат сохраняет биты оригинала только в битах, которые установлены в 1 в маске; все остальные биты становятся равными нулю. Это происходит потому, что "И" следует этому правилу:

X & 0 -> 0 for any value of X
X & 1 -> X for any value of X

Например, если вы AND 0177 и 0545454, вы получаете

0000000001111111 -- 0000177
0101010101010101 -- 0545454
----------------    -------
0000000001010101 -- 0000154

Ответ 2

В C целочисленный литерал с префиксом 0 является восьмеричным числом, поэтому 0177 является восьмеричным числом.

Каждая восьмеричная цифра (от 0 до 7) представлена ​​3 битами, а 7 является наибольшим значением для каждой цифры. Таким образом, значение 7 в восьмеричном значении означает бит 3.

Ответ 3

Так как 0177 является восьмеричным литералом, и каждое восьмеричное число 3 имеет три бита, следующие бинарные эквиваленты:

7  = 111
1  = 001

Что означает 0177 001111111 в двоичном формате.

Ответ 4

Уже объяснено, что первый " 0" используется для восьмеричного представления числа в ANSI C. На самом деле число 0177 (восьмеричное) совпадает с числом 127 (в десятичной форме), которая 128-1, а также может быть представлена ​​как 2^7-1, а 2^n-1 в двоичном представлении означает n 1 и поместить все 1 вправо.

0177 = 127 = 128-1

который является битовой маской;

000000000000000000000000 1111111

Вы можете проверить код ниже:

Demo

#include <stdio.h>

int main()
{
    int n = 0177;   // octal representation of 127
    printf("Decimal:[%d] : Octal:[%o]\n", n, n, n);

    n = 127;        // decimal representation of 127
    printf("Decimal:[%d] : Octal:[%o]\n", n, n, n);

    return 0;
}

Выход

Decimal:[127] : Octal:[177]
Decimal:[127] : Octal:[177]

Ответ 5

0177 - это восьмеричное значение, каждая цифра представлена ​​тремя битами из значения 000-111, поэтому 0711 переводит на 001111111, который, если вы считаете в 32-битном двоичном формате (может быть также 64 бит, за исключением того, что остальная часть цифр заполняется в соответствии с бит MSB, т.е. знаковый бит в этом случае, значение 0) составляет 0000000000000000000000001111111 и и выполняет поразрядное с ним значение для заданного числа, будет выводить младшие 7 бит числа, переворачивая остальную часть цифр в n-битовом числе на 0.

(since x&0 =0 & x&1=x e.g 0&0=0 ,1&0=0, 1&1=1 0&1=1)