Explicación detallada de operadores de desplazamiento y operadores de bit en lenguaje C

contenido

1. Operador de turno

2. Operador de bits


1. Operador de turno

Se divide en operador de desplazamiento a la izquierda (<<) y operador de desplazamiento a la derecha (>>).

Operador de desplazamiento a la izquierda:

Reglas de cambio: descartar a la izquierda y agregar 0 a la derecha.

¿Qué quieres decir? Déjame explicarlo en detalle ahora.

Por ejemplo, definimos una variable entera a y le asignamos un valor inicial de 5. Por ejemplo, int a=5, luego movemos a a la izquierda, es decir, a<<2, ¿cuál es el resultado? Antes de hablar, primero debemos entender cómo se almacena en la memoria el número entero 5. Para aquellos que no estén seguros, consulte mi publicación anterior en el blog sobre las tres expresiones de los números enteros y su almacenamiento en la memoria.Hay explicaciones detalladas. El número entero 5 se almacena en forma de complemento a dos. Desplazar 5 a la izquierda 2 bits significa desplazar los bits binarios almacenados en la memoria 2 bits a la izquierda, descartar los 2 bits y rellenar el lado derecho con ceros. El resultado final es el resultado después de 5<<2, que se puede describir brevemente con la siguiente imagen~

 De acuerdo con la figura anterior, el resultado obtenido después de a<<2 es 20.

Operador de turno a la derecha:

Primero, hay dos tipos de operaciones de desplazamiento a la derecha. Desplazamientos aritméticos y desplazamientos lógicos.

Regla de cambio aritmético: el lado izquierdo se rellena con el bit de signo del valor y el lado derecho se descarta.

Regla de cambio lógico: la izquierda se complementa con 0 y la derecha se descarta.

¿Qué significa específicamente, veamos algunos ejemplos, como desplazar 5 a la derecha, es decir, 5 >> 1, cuánto obtienes?

Si se trata de un cambio aritmético, es mover el bit binario almacenado en la memoria en 5 a la derecha en 1 bit y descartar este bit, y llenar el lado izquierdo con el bit de signo del bit binario almacenado en el valor. Como se muestra abajo:

Entonces el resultado de 5>>1 es 2. ¿Qué pasa con el cambio lógico? El cambio lógico es usar 0 a la izquierda, complementar y descartar a la derecha. Para números positivos, el bit de signo es 0, por lo que el resultado del cambio aritmético y el cambio lógico es el mismo. El cambio lógico también se puede representar mediante la figura anterior, y el resultado también es 2.

Si cambia -5 al lugar correcto, ¿cuál es el resultado? Echemos un vistazo primero al cambio aritmético, por lo que no entraré en detalles. Por favor, vea la siguiente figura:

Entonces -5>>1 cambio aritmético da -3.

De la misma manera, echemos un vistazo a lo que se obtiene con -5>>1 desplazamiento lógico~

Como el bit más alto es 0, el resultado final es 3~. Pero en general, se utilizan desplazamientos aritméticos.

2. Operador de bits

& bit a bit (binario) Y

| Bit a bit (bits binarios) o

^ Bit a bit (binario) XOR

Miremos este código directamente. Primero puede adivinar qué tres números se muestran al final:

int main()
{
	int a = 3;
	int b = -5;
	printf("%d %d %d", a & b, a | b, a ^ b);
	return 0;
}

Analicémoslo primero: AND bit a bit es comparar los bits binarios almacenados en dos números, y si ambos son 1, es 1, de lo contrario es 0. Por lo tanto, a&b se puede analizar con un gráfico como:

Entonces el resultado de a&b es 3.

Bitwise OR es comparar los bits binarios almacenados en dos números, si uno de los dos es 1, es 1, de lo contrario es 0. Por lo tanto, a|b se puede analizar con un gráfico como:

Entonces el valor de a|b es -5.

El XOR bit a bit es para comparar los bits binarios almacenados en dos números. El mismo es 0, y la diferencia es 1. Por lo tanto, a^b se analiza mediante un gráfico:

 Entonces el resultado de a^b es -8.

Finalmente, ejecutemos el programa:

 ¿Es lo mismo que el análisis?

Ya esta por aquí, espero que le den un like~~~

Supongo que te gusta

Origin blog.csdn.net/m0_63039919/article/details/121494424
Recomendado
Clasificación