Red de conocimiento de abogados - Derecho de sociedades - Cómo utilizar el operador de turnos en lenguaje C

Cómo utilizar el operador de turnos en lenguaje C

Al realizar el turno, todos los bits que se mueven se descartan y el número de vacantes que se mueven está relacionado con si el turno es hacia la izquierda o hacia la derecha. Si es un desplazamiento a la izquierda, se estipula que todos los números a sumar son 0; si es un desplazamiento a la derecha, también depende de si los datos desplazados tienen signo. Si es un número sin signo, todos los números agregados son 0; si es un número con signo, todos los números agregados son iguales al número original en el bit más a la izquierda del número original (es decir, el bit de signo original). Las reglas de cambio específicas son las siguientes.

La precedencia de los operadores de desplazamiento de bits es la siguiente:

·Los operadores aritméticos tienen prioridad sobre los desplazamientos de bits Los operadores de bits tienen prioridad sobre los operadores relacionales

·Bit de desplazamiento los operadores son del mismo nivel y la asociatividad es de izquierda a derecha

Por ejemplo, si la variable entera corta sin signo a es 0111 (el número binario correspondiente es 0000000001001001),

entonces : alt; lt; 3 El resultado es 01110 (correspondiente al número binario 0000001001001000), a permanece sin cambios

agt; 4 El resultado es 04 (correspondiente al número binario 0000000000000100), a

Otro ejemplo, sea la variable entera corta a -4 (correspondiente al número binario 1111111111111100),

Entonces: alt;lt;3, el resultado es -32 (correspondiente al número binario 1111111111100000), un sin cambios

agt; gt; 4 El resultado es -1 (correspondiente al número binario 1111111111111111), sin cambios

Operaciones de desplazamiento a la izquierda y a la derecha en lenguaje C

 2006-09-30 13:52

Hablemos primero del desplazamiento a la izquierda. El desplazamiento a la izquierda es mover todos los bits de un número hacia la izquierda en un número determinado. de bits. En C, utilice el operador lt; i a la izquierda 2 bits

Es decir, digamos que el sistema binario de 1 es 000...0001 (el número de ceros delante de 1 aquí está relacionado con el número de dígitos en int. On En una máquina de 32 bits, hay 31 0 en gcc). Después de desplazarse 2 bits hacia la izquierda, se convierte en 000... 0100, que es 4 en decimal, por lo que desplazarse un bit hacia la izquierda equivale a multiplicar por 2. luego, desplazar n bits hacia la izquierda es multiplicar por 2 elevado a la enésima potencia (los números con signo no son completamente aplicables, porque es posible que el desplazamiento hacia la izquierda provoque un cambio de signo, el motivo se explica a continuación)

Un problema que necesita atención es el bit de signo más a la izquierda y el desplazamiento del tipo int. Sabemos que int es un entero con signo y el bit 1 más a la izquierda es el bit de signo, es decir, 0 es positivo y 1 es negativo, por lo que se producirá un desbordamiento al realizar el desplazamiento. ejemplo:

int i = 0x40000000; //40000000 en hexadecimal es 01000000 en binario ...0000

i = i lt; Me convertiré en 0x80000000 después de desplazarme 1 bit hacia la izquierda, que es 100000 en binario ..0000, el bit de signo se establece en 1 y los demás bits son todos 0, que se convierte en el valor mínimo que el tipo int puede representar. El valor del int de 32 bits es -2147483648, desbordándose. Si luego mueve i hacia la izquierda 1 bit, ¿Qué sucede? En el lenguaje C, el bit más alto se descarta. Después de descartar 1, se descarta el valor de i. se convierte en 0.

Un caso especial en el desplazamiento a la izquierda es cuando el desplazamiento a la izquierda Cuando el número de dígitos excede el número máximo de dígitos del tipo numérico, el compilador usará el número de dígitos desplazados a la izquierda para módulo el número máximo de dígitos del tipo y luego desplazar el resto, como por ejemplo:

int i = 1, j = 0x80000000 //Establecer int en 32 bits

i; = i lt; 33; // 33 32 = 1 Desplazamiento a la izquierda 1 bit, i se convierte en 2

j = j lt 33; , j se convierte en 0 y el bit más alto se descarta

Al compilar este programa con gcc, el compilador dará una advertencia, diciendo que el número de desplazamientos a la izquierda gt = longitud del tipo. , j' movido es 1 bit, que es el resto después de 3332. Esta es la regla de gcc. ¿Es lo mismo para otros compiladores?

Aún no está claro.

En resumen, el desplazamiento a la izquierda es: descartar el bit más alto y llenar el bit más bajo con 0.

Ahora hablemos del desplazamiento a la derecha si comprende el principio. de desplazamiento a la izquierda, entonces el desplazamiento a la derecha es más fácil de entender.

El concepto de desplazamiento a la derecha es opuesto al de desplazamiento a la izquierda, que consiste en moverse unos pocos bits hacia la derecha. /p>

El procesamiento del bit de signo mediante desplazamiento a la derecha y desplazamiento a la izquierda. Diferente, para enteros con signo, como el tipo int, el desplazamiento a la derecha mantendrá el bit de signo sin cambios, por ejemplo:

int i = 0x80000000;

i = i gt; 1; // El valor de i no se convertirá en 0x40000000, sino en 0xc0000000

Es decir, después del bit de signo. movido hacia la derecha, se agrega 0 para números positivos y 1 para números negativos, es decir, en lenguaje ensamblador Desplazamiento aritmético a la derecha De manera similar, cuando el número de dígitos desplazados excede la longitud del tipo, se tomará el resto y luego. el resto se moverá

Número negativo 10100110 gt; gt; 5 (suponiendo que la longitud de la palabra sea de 8 bits), el resultado es 11111101

En resumen, en C, la izquierda. El desplazamiento es un desplazamiento lógico/aritmético hacia la izquierda (los dos son exactamente iguales), y el desplazamiento hacia la derecha es un desplazamiento aritmético hacia la derecha, que mantendrá el bit de signo sin cambios. En aplicaciones prácticas, puede utilizar el desplazamiento hacia la izquierda/derecha para realizar una multiplicación rápida. operaciones de división según la situación, que es mucho más eficiente que el bucle.

En muchos programas del sistema, a menudo se requieren operaciones o procesamiento a nivel de bits. El lenguaje C proporciona la función de operaciones de bits, lo que permite utilizar el lenguaje C para escribir programas del sistema como el lenguaje ensamblador.

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Rol del operador

───────────────────────────────────────

amp; Bit lógico Y

| Bit lógico O

 ^ Bit lógico exclusivo O

- Inversión lógica de bits

 gt;gt;

lt;lt; Shift izquierda

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Las operaciones bit a bit se realizan en palabras. Detecta, establece o desplaza los bits reales en una sección o palabra. Solo es aplicable a variables de caracteres y enteros y sus variantes.

Debemos prestar atención a distinguir entre operaciones de bits y operaciones lógicas.

1. Operación AND bit a bit

El operador AND bit a bit "amp;" es un operador binario. Su función es realizar el AND binario de los dos números correspondientes involucrados en la operación. Solo cuando los dos bits binarios correspondientes son 1, el bit de resultado es 1; de lo contrario, es 0. Los números involucrados en la operación aparecen en formato de complemento a dos.

Por ejemplo: 9amp; 5 se puede escribir de la siguiente manera: 00001001 (complemento a dos de 9)amp; 00000101 (complemento a dos de 5) 00000001 (complemento a dos de 1) Se puede observar que 9amp;5 =1.

La operación AND bit a bit se utiliza generalmente para borrar algunos bits a 0 o retener algunos bits. Por ejemplo, borre los ocho bits superiores de a a 0 y mantenga los ocho bits bajos, y podrá realizar una operación &255 (el número binario de 255 es 0000000011111111).

main(){

int a=9, b=5, c

c=aamp; ("a=d b=d c=d ", a, b, c);

}

2. Operación OR bit a bit

Operación OR bit a bit El símbolo "|" es un operador binario. Su función es el OR binario correspondiente a los dos números que intervienen en la operación. Siempre que uno de los dos bits binarios correspondientes sea 1, el bit de resultado será 1. Los dos números implicados en la operación aparecen en complemento a dos.

Por ejemplo: 9|5 se puede escribir de la siguiente manera: 00001001|00000101

00001101 (el decimal es 13) visible 9|5=13

main( ){

int a=9, b=5, c;

c=a|b

printf("a=d b=d c=d; ", a, b, c);

}

3. Operación XOR bit a bit

El operador XOR bit a bit "^" es un operador binario. Su función es realizar el OR exclusivo de los bits binarios correspondientes de los dos números involucrados en la operación. Cuando los dos bits binarios correspondientes son diferentes, el resultado es 1. Los operandos participantes todavía aparecen en complemento. Por ejemplo, 9^5 se puede escribir como la siguiente fórmula: 00001001^00000101 00001100 (12 en decimal)

main(){

int. a=9;

a=a^15;

printf("a=d ",a); 4. Operación de negación

El operador de negación es un operador unario y tiene asociatividad correcta. Su función es realizar la negación bit a bit de cada dígito binario del número involucrado en la operación. Por ejemplo, la operación de ~9 es: ~(0000000000001001) El resultado es: 1111111111110110

5. Operación de desplazamiento a la izquierda

El operador de desplazamiento a la izquierda "lt; lt;" operador binario. Su función es desplazar todos los bits binarios del operando a la izquierda de "lt;lt;" hacia la izquierda un cierto número de bits. El número a la derecha de "lt;lt;" especifica el número de bits desplazados. El bit alto se descarta y el bit bajo se llena con 0. Por ejemplo: alt;lt;4 significa mover cada bit binario de 4 bits hacia la izquierda. Por ejemplo, a=00000011 (3 decimal), después de desplazarse 4 bits hacia la izquierda, es 00110000 (48 decimal).

6. Operación de desplazamiento a la derecha

El operador de desplazamiento a la derecha "gt; gt;" es un operador binario. Su función es desplazar todos los dígitos binarios del operando a la izquierda de "gt; gt;" hacia la derecha un cierto número de dígitos, y el número a la derecha de "gt; gt;" especifica el número de dígitos. para moverse. Por ejemplo: supongamos que a=15, agt; gt; 2 significa desplazar 000001111 hacia la derecha a 00000011 (decimal 3). Cabe señalar que para números con signo, al desplazarse hacia la derecha, el bit de signo se moverá con él. Cuando es un número positivo, el bit más alto se llena con 0, y cuando es un número negativo, el bit de signo es 1, y el bit más alto se llena con 0 o 1, dependiendo de las disposiciones del sistema de compilación.

main(){

unsigned a, b;

printf("ingrese un número:

scanf("); d",amp; a);

b=agt; gt; 5;

b=bamp; 15;

printf("a=d b= d ", a, b);

}

¡Mira otro ejemplo!

main(){

char a= ' a', b='b';

int p, c, d

p=a

p=(plt; lt; 8 ) |b;

d=pamp; 0xff;

c=(pamp; 0xff00)gt;

printf("a=d b; = d c=d d=d ", a, b, c, d);

}

Al realizar AND o bit a bit, es mejor usar hexadecimal, como en el programa Representa : 0x01 representa 0000 0001

Por lo tanto, el bit más alto del tipo de carácter a se fuerza a 1 de esta manera: a=a|0x80. ¡Otros se pueden deducir a su vez!