Seis operadores bit a bit en lenguaje C
& bit a bit AND | bit a bit o ^ bit a bit XOR ~ negación << desplazamiento a la izquierda >> desplazamiento a la derecha El operador AND bit a bit & 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: 9&5 se puede escribir de la siguiente manera: 00001001 (complemento a dos de 9)&00000101 (complemento a dos de 5) 00000001 (complemento a dos de 1) Se puede observar que 9&5=1. La operación AND bit a bit se utiliza generalmente para borrar algunos bits a 0 o retener algunos bits. Por ejemplo, al borrar los ocho bits superiores de a a 0 y conservar los ocho bits inferiores, se puede realizar la operación a&255 (el número binario de 255 es 11111111). main(){inta=9,b=5,c;c=a&b;printf(a=%d\nb=%d\nc=%d\n,a,b,c);} Operador OR bit a bit "| " 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. Se puede ver que 9|5=13 main(){inta=9). ,b=5,c; c=a|b;printf(a=%d\nb=%d\nc=%d\n,a,b,c);} El operador OR exclusivo 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 siguen apareciendo en complemento.
Por ejemplo, 9^5 se puede escribir como la siguiente fórmula: ?00001001?^?00000101=00001100 (12 en decimal) main(){inta=9;a=a^15;printf( a=%d\ n,a);} 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 negación de ~9 es: ~(1001) y el resultado es: 0110 El operador de desplazamiento a la izquierda "<<" es un operador binario. Desplazar n bits hacia la izquierda es multiplicar por 2 elevado a la enésima potencia. Su función es desplazar todos los bits binarios del operando en el lado izquierdo de "<<" hacia la izquierda en un cierto número de bits. El número en el lado derecho de "<<" especifica el número de bits desplazados. Los bits altos se descartan y los bits bajos se rellenan con 0.
1) Ejemplo: a<<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).
2) Ejemplo: int i = 1; i = i << 2; //Desplaza el valor en i hacia la izquierda 2 bits. ..0001 (El número de ceros delante de 1 aquí está relacionado con el número de dígitos en int. En una máquina de 32 bits, hay 31 ceros en gcc). Después de desplazarse 2 dígitos hacia la izquierda, se convierte en 000. .0100, que es 4 en decimal, por lo que desplazar 1 bit a la izquierda equivale a multiplicar por 2, por lo que desplazar n bits a la izquierda es multiplicar por 2 a la enésima potencia (los números con signo no son completamente aplicables, porque el desplazamiento a la izquierda puede causar que el signo cambios, las razones se explican 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 signo. bit, es decir, 0 positivo y 1 negativo, se producirá un desbordamiento al cambiar, por ejemplo: int i = 0x40000000; // 40000000 en hexadecimal es 01000000...0000 en binario. se desplaza 1 bit hacia la izquierda Se convertirá en 0x80000000, que es 100000...0000 en binario. 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 de un int de 32 bits es Desbordamiento. ¿Qué pasará si luego se desplaza 1 bit hacia la izquierda?
En lenguaje C, el bit más alto se descarta después de descartar 1, el valor. de i se convierte en 0. Un caso especial de desplazamiento a la izquierda es que cuando el número de dígitos desplazados hacia la izquierda excede el número máximo de dígitos del tipo numérico, el compilador utilizará el número de dígitos que quedan para desplazar módulo el número máximo de dígitos. del tipo, y luego desplazar por el resto, como por ejemplo: int i = 1, j = 0x80000000; //Establecer int en 32 bits i = i << 33; // 33 % 32 = 1 Desplazarse 1 bit a la izquierda, i se convierte en 2 j = j << 33; // 33 % 32 = 1 Desplazamiento a la izquierda 1 bit, 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 >= longitud del tipo. Entonces, en realidad, lo que j mueve es 1 bit, que es el resto después del 33%32. Esta es la regla de gcc, y es posible que diferentes compiladores no sean exactamente iguales.
En resumen, el desplazamiento a la izquierda significa: descartar el bit más alto y llenarlo con 0. El operador de desplazamiento más bajo a la derecha ">>" es un operador binario. Desplazar n bits hacia la derecha es dividir por 2 a la enésima potencia
Su función es desplazar todos los dígitos binarios del operando a la izquierda de ">>" hacia la derecha una cierta cantidad de bits y el número a la derecha de ">>" especifica el número de dígitos del turno.
Por ejemplo: asumiendo a=15, a>>2 significa mover 00001111 a la derecha a 00000011 (3 decimal). 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 si el bit más alto se llena con 0 o 1 depende de las disposiciones del sistema de compilación. Turbo C y muchos sistemas especifican un complemento de 1.
El desplazamiento a la derecha maneja el bit de signo de manera diferente que el desplazamiento a la izquierda: 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 >> 1; // El valor de i no se convertirá en 0x40000000, pero se convertirá en 0xc0000000 Es decir, para números con signo, después de mover el bit de signo hacia la derecha, se agrega 0 para números positivos. 1 para números negativos, para números con signo, al desplazarse hacia la derecha, el bit de signo se moverá al mismo tiempo: 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. que es el desplazamiento aritmético a la derecha en lenguaje ensamblador. De manera similar, cuando el número de bits movidos excede la longitud del tipo, se tomará el resto y luego se moverán los bits restantes, ya sea que el bit más alto se complete con 0 o 0. 1s depende de las disposiciones del sistema de compilación. Turbo C y muchos sistemas especifican un complemento de 1.
Número negativo 10100110 >> 5 (suponiendo que la longitud de la palabra sea de 8 bits), el resultado es 11111101. En resumen, en C, el desplazamiento a la izquierda es un desplazamiento lógico/aritmético a la izquierda (los dos son exactamente iguales), el desplazamiento a la derecha es un desplazamiento aritmético a la derecha. , y el signo se mantendrá. El bit permanece sin cambios. En aplicaciones reales, se pueden usar desplazamientos hacia la izquierda/derecha para realizar operaciones rápidas de multiplicación/división según la situación, lo que será mucho más eficiente que el bucle.
. x>>1;//es equivalente a x/ =2x<<1;//equivalente a x*=2x>>2;//x/=4x<<2;//x*=4x>> 3;//x/=8x<<3;// x*=8 y así sucesivamente. Sin firmar: main() { sin firmar,b; printf(inputanumber:); >5; b=b&15; printf(a=%d \tb=%d\n,a,b);} ¡Mire otro ejemplo main(){chara='a',b='b';intp! ,c,d;p=a;p=(p< <8)|b;d=p&0xff;c=(p&0xff00)>>8;printf(a=%d\nb=%d\nc=%d\ nd=%d\n,a,b,c,d );} 1. Para invertir un bit específico, simplemente establezca los bits que realizan la operación ∧ en 1.
2 es lo mismo que 0 y conserva el valor original.
3. Intercambiar dos valores sin utilizar variables temporales Podemos realizar el intercambio de valores de variables sin introducir. otras variables se pueden implementar: a = a^b; //
(1) b = a^b; //
(2) a = a^; b; //
(3) La operación XOR satisface la ley asociativa y la ley conmutativa, y se sabe por las propiedades de la operación XOR que para cualquier número entero a^a=0; a en el paso (2) ) a = a^b = (sustituyendo b en el paso (1) por b) a^(a^b) = b; (b en el paso (3))b =a^b = (sustituyendo (Sustituya b en el paso 1) en b, y sustituya a en el paso (2) en a) a^b^a^a^b = a^a^a^b^b = a; Borre el número A a 1 bit; , el bit correspondiente en B es 0. Luego realice & operación en los dos para lograr el propósito de limpiar A.
Para tomar ciertos bits específicos de un número, tome ciertos bits del número A, establezca ciertos bits del número B en 1 y simplemente haga AND bit a bit de ciertos bits del número A con 1.
El método para retener un bit es realizar la operación & entre el número A y el número B. El número B en el número A tiene un 1 en el bit a reservar y los bits restantes son cero.
Juzga la paridad de la variable a. Realice una operación AND bit a bit entre a y 1. Si el resultado es 1, entonces a es un número impar. Realice una operación AND bit a bit entre a y 1. Si el resultado es 0, entonces a es un número par;
Determine si la variable de tipo int a es par o impar a&1 = 0 par a&1 = 1 impar
Tome el k-ésimo bit de la variable de tipo int a (k=0,1,2...sizeof(int )), es decir a>>k&1
Borrar el k-ésimo bit de la variable de tipo int a a 0, es decir, a=a&~(1< Borre el k-ésimo bit de la variable de tipo int a 1. Es decir, a=a|(1< La variable de tipo int se desplaza cíclicamente hacia la izquierda k veces, es decir, a =a< La variable de tipo int a se desplaza cíclicamente hacia la derecha k veces, es decir, a=a>> k|a<<16-k (suponiendo sizeof(int)=16) Entero El valor promedio Para dos números enteros x, y, si usa (x+y) /2 para encontrar el promedio, se producirá un desbordamiento porque x+y puede ser mayor que INT_MAX, pero conocemos su promedio. ¿El valor definitivamente no es correcto?/DIV> int Average(int x, int y) //Devuelve el valor promedio of X, Y{ return (x&y)+((x^y) >>1); Determina si un número entero es una potencia de 2. Para un número x >= 0, determina si es una potencia de 2 boolean power2(int x) { return ((x&(x -1))==0)&&(x!=0 } Intercambia dos números enteros sin temp void swap(); int x, int y) { x ^= y; y ^= x; x ^= y } php: $a ='dd'; $a = $a $b; = $a ^ $b; $a = $a ^ $b; echo $a,'', $b 10 Calcular el valor absoluto int abs( int x ) { int y =; x >> 31 ; return (x^y)-y ; //o: (x+y)^y } La operación de módulo se convierte en una operación de bits (sin desbordamiento) a % (2 ^n) es equivalente a a & (2^n - 1) 12 Las operaciones de multiplicación se convierten en operaciones de bits (sin desbordamiento) a * (2^n) es equivalente a a<< n 13. Las operaciones de división se convierten en operaciones de bits (sin desbordamiento) a / ( 2^n) es equivalente a a>> n Ejemplo: 12/8 == 12>>3 14. a % 2 es equivalente a a & 1 15 si (x == a) x= b; else x= a; Equivalente a x= a ^ b ^ x; 16 El número opuesto de x se expresa como (~x+1)abc