Habilidades de operación eficientes en operación de bits

Operación básica de operación de bits:

  • & (Y): ambos son 1 y el resultado es 1
  • | (O): Si uno es 1, el resultado es 1
  • ~ (No): 0 se convierte en 1, 1 se convierte en 0
  • ^ (OR exclusivo): solo 1 cuando los dos no son iguales
  • (>>): operador de desplazamiento a la derecha, desplazar el bit binario a la derecha, desplazar un bit a la derecha equivale a dividir por 2
  • (<<): operador de desplazamiento a la izquierda, desplazar los dígitos binarios a la izquierda, desplazar un bit a la izquierda equivale a multiplicar por 2
  • (>>): el bit de signo se utilizará para llenar los bits altos
  • Para el tipo int, 1 << 35 y 1 << 3 son iguales (porque int32 bits deben ser módulo 32), y cuando el operando izquierdo es de tipo largo, debe ser módulo 64

Algunas propiedades de XOR:

  • Ley conmutativa, la posición del factor se puede cambiar a voluntad, el resultado permanece
  • Ley asociativa, es decir (a ^ b) ^ c == a ^ (b ^ c)
  • Para cualquier número x, hay x ^ x = 0, x ^ 0 = x, lo mismo que uno mismo o igual a 0, y lo mismo que cero para uno mismo
  • Reflexividad, A ^ B ^ B = A ^ 0 = A, operación XOR con el mismo factor continuamente, el resultado final es él mismo

Algunos consejos para utilizar operaciones con bits:

1. Determina el número par y el impar

Para los números impares, el último dígito del binario debe ser 1, y para los números pares, el último dígito del binario debe ser 0, por lo que es suficiente para juzgar si un número es par o impar y directamente Y con 1

#include <iostream>
using namespace std;
int main()
{
    
    
	int num;
	cin>>num;
	if(num&1)
		cout<<num<<"为奇数"<<endl;
	else
		cout<<num<<"为偶数"<<endl; 
		
	return 0;
 } 

2. Intercambia los valores de dos variables enteras

Dados dos números enteros A y B, se requiere intercambiar los valores de los dos números. El método convencional es definir otra variable e intercambiarla. El método más eficiente sigue siendo la operación de bits.
A = A ^ B
B = A ^ B (En este momento B = (A ^ B) ^ B = A)
A = A ^ B (En este momento A = (A ^ B) ^ A = B)
Por lo tanto, se completa El intercambio de A y B

#include <iostream>
using namespace std;
int main()
{
    
    
int a,b;
	cin>>a>>b;
	a=a^b;
	b=a^b;
	a=a^b;
	cout<<"a="<<a<<endl;
	cout<<"b="<<b<<endl;	
			
	return 0;
 } 

3. Obtenga si el bit binario es 1 o 0

Por ejemplo, dado un número a, se requiere encontrar si el x-ésimo bit del número binario es 1 o 0.
En este momento, el k-ésimo bit del número y 1 se pueden anular directamente con el AND, es decir, 1 se desplaza hacia la izquierda en k-1 bits, y luego realiza una operación Y con el número. Si es 1, significa que el x-ésimo bit es 1, y si es 0, significa que el x-ésimo bit es 0 .
num y (1 << k-1)

#include <iostream>
using namespace std;
int main()
{
    
    
int num,k;//k表示num的第k位 
	cin>>num>>k;
	if(num&(1<<k-1))
		cout<<num<<"的第"<<k<<"位为:1"<<endl;
	else
		cout<<num<<"的第"<<k<<"位为:0"<<endl;
			
	return 0;
 } 

4. Encuentra el valor absoluto de un número entero.

Cómo obtener el valor absoluto de un número sin usar la sentencia de juicio, y en este momento, se usa la operación de bit.
1. Para un número positivo, su bit de signo es 0, por lo que el número positivo se desplaza hacia la derecha (con signo <<) 31 bits, obtendrá todos 0 y el valor es 0 en este momento. El valor absoluto de un número positivo es en sí mismo
2. Para un número negativo, su bit de signo es 1. Por lo tanto, si el número negativo se desplaza a la derecha 31 bits (con signo <<), se obtendrán todos los 1 y el valor es -1 (porque la computadora se almacena en el complemento de uno). El valor absoluto de un número negativo se puede obtener invirtiéndolo y sumando uno.

int t=(a>>31);
如果a是正数,则t为0,a为负数,则t为-1
int ans=(a^t)-t;
a为正数,绝对值就是其本身
a为负数时,a^t就是对a进行按位取反,t为-1,
减去t就是加上1,从而得到其绝对值。
#include <iostream>
using namespace std;
int main()
{
    
    
	int a;
	cin>>a;
	int t=(a>>31);
	int ans=(a^t)-t;
	cout<<ans<<endl; 
			
	return 0;
 } 

5. Encuentra el número 1 en el número

Hay dos formas de encontrar el número de unos en el sistema binario de un número.

(1) El número de tipo int es 32 bits, por lo que el bucle for 32 veces, el número y 1 se desplazan a la izquierda en k bits, y el resultado obtenido es 1 a la izquierda en k bits iguales, entonces el k-ésimo bit del número es 1 .

#include <iostream>
using namespace std;
int main()
{
    
    
int n;
	cin>>n;
	int cnt=0;
	for(int i=0;i<32;i++)
	{
    
    
		if((n&(1<<i))==(1<<i))
			cnt++;
	}
	cout<<cnt<<endl;
			
	return 0;
 } 

(2) Suponiendo que el binario de este número es 10100, primero reste el número en uno para convertirlo en 10011 (se puede encontrar que mientras el número se reste por 1, el bit más bajo del número se convierte en 0, y el siguiente bit cambia a 1), la operación AND de 10011 y 10100 es 10000, y se elimina un 1, por lo que el número de 1 eliminados se puede registrar hasta que el número sea 0.

#include <iostream>
using namespace std;
int main()
{
    
    
	int n;
	cin>>n;
	int cnt=0;
	while(n)
	{
    
    
		n=(n-1)&n;
		cnt++;
	} 
	cout<<cnt<<endl;
	return 0;
 } 

Supongo que te gusta

Origin blog.csdn.net/weixin_45102820/article/details/113049036
Recomendado
Clasificación