Как этот побитовый оператор И маскирует младшие семь битов заказа числа?
Я читаю "Язык программирования 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)