rotacion operadores mascara manipular manipulacion logicos como bitwise c bit-manipulation bit bitwise-operators

operadores - ¿Cómo está este operador Y a nivel de bits enmascarando los siete bits de orden inferior del número?



operadores logicos (5)

0177 es un valor octal, cada dígito está representado por 3 bits desde el valor 000 hasta 111, por lo que 0711 se traduce en 001111111, lo que si se considera en binario de 32 bits (también puede ser de 64 bits, excepto que el resto de los dígitos se completan según MSB, es decir, el bit de signo en este caso el valor 0) la forma es 00000000000000000000000000001111111 y al realizar un bit con él para un número dado, dará salida a los 7 bits más bajos del número que gira del resto de los dígitos en el número de n bits.

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

Estoy leyendo El lenguaje de programación C por Brian Kernigan y Dennis Ritchie. Aquí está lo que dice sobre el operador bitwise AND:

El operador AND a nivel de bit & menudo se usa para enmascarar un conjunto de bits, por ejemplo,

n = n & 0177

establece en cero todos menos los 7 bits de orden inferior de n .

No veo muy bien cómo está enmascarando los siete bits de orden inferior de n . Por favor alguien puede aclarar?


Dado que 0177 es un literal octal y cada número octal es 3 tres bits que tiene, los siguientes equivalentes binarios:

7 = 111 1 = 001

Lo que significa que 0177 es 001111111 en binario.


El número 0177 es un número octal que representa el siguiente patrón binario:

0000000001111111

Cuando usted AND la utiliza mediante la operación a nivel de bits & , el resultado mantiene los bits del original solo en los bits que se establecen en 1 en la "máscara"; todos los demás bits se vuelven cero. Esto se debe a que "AND" sigue esta regla:

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

Por ejemplo, si usted AND 0177 y 0545454 , obtiene

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


En C, un literal entero con el prefijo 0 es un número octal, por lo que 0177 es un número octal.

Cada dígito octal (de valor 0 a 7 ) se representa con 3 bits y 7 es el mayor valor para cada dígito. Entonces, un valor de 7 en octal significa 3 bits establecidos.


Ya se explicó que el primer '' 0 '' utilizado para la representación octal de un número en ANSI C. En realidad, el número 0177 (octal) es igual a 127 (en decimal), que es 128-1 y también se puede representar como 2^7-1 , y 2^n-1 en la representación binaria significa tomar n 1 y poner todos El 1 está a la derecha.

0177 = 127 = 128-1

que es una máscara de bits ;

000000000000000000000000 1111111

Puedes ver el código abajo abajo;

Manifestación

#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; }

Salida

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