A menudo puede ver operaciones de bits al mirar la expansión de conjunto, así que dele la vuelta y revise
1. Código original, código complementario, código invertido
- Código original: convierta el valor en binario, el bit más alto representa el bit de signo
- Código inverso: sobre la base del código original, el número positivo no cambia, el bit de signo negativo no cambia y el resto se invierte
- Código complementario: sobre la base del código original, el número positivo permanece sin cambios, el signo negativo permanece sin cambios, y los bits restantes se invierten y luego se agregan por 1 (es decir, el código inverso + 1)
Las tres son diferentes formas de almacenamiento de datos por parte de las computadoras, y las computadoras usan códigos complementarios para almacenar datos. Y la computadora puede usar estos tres para sumar y restar
Código inverso:
1+(-1) = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
El código inverso aparece [0000 0000] original y [1000 0000] los dos códigos originales indican 0 positivo y negativo, el complemento
Complemento
1+(-1) = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 = [0000 0000]原
Se resolvieron los diferentes problemas de codificación 0 positiva y negativa.
2. Operación de bits
Las operaciones de bit se realizan en el sistema binario subyacente.
Símbolo | Descripción | Reglas de cálculo |
---|---|---|
Y | Con | Ambos son 1, el resultado es 1 |
El | | O | Ambos son 0, el resultado es 0 |
^ | XOR | Igual que 0 Diferente 1 |
~ | Negate | 0 se convierte en 1, 1 se convierte en 0 |
<< | Desplazar a la izquierda | Cada bit binario se desplaza hacia la izquierda unos pocos bits, el bit alto se descarta y el bit bajo se llena con 0s. Significa poder de 2 |
>> | Desplazamiento a la derecha | Cada bit binario se desplaza a la derecha unos pocos bits, y el número sin signo se llena con 0 en los bits superiores. Significa dividir por 2 |
Número firmado, el método de procesamiento de cada compilador es diferente, algunos complementan el bit de signo (desplazamiento aritmético a la derecha) y algunos complementan a 0 (desplazamiento lógico a la derecha) | ||
>>> | Desplazamiento lógico a la derecha | Independientemente del bit de signo, cambie directamente a la derecha, relleno cero |
3. Operación real
Juzgar la paridad
// 最末尾为0偶数,1奇数
public static void main(String[] args) throws IOException {
int a = 4;
if( (a & 1) == 0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
}
Módulo
h & (length-1)
// 其实很简单,主要看length
// &运算,就算h全部为1,&之后都是看length有1的部分,高位全为0
// 那么最大只能是length,所以范围限定在了length里,比 % 运算快多了
// -1为了符合数组0开始
// 这也是扩容为2次幂的原因,配合取模运算
Potencia de 2 (solo uno 1, otros bits son 0)
1---0001
2---0010
4---0100
8---1000
Poder rápido
int poww(int a,int b){
int res = 1;
int base = a;
while(b != 0){
if( b & 1 != 0){ // 找到二进制尾数为1的
res *= base; // 结果乘于幂
}
base *= base; // 这里呢,一直乘,模拟次幂递增,如果上面为1了,那么这样就会对应到乘于几次幂
b >>= 1;
}
return res;
}
Adición bit a bit
public int Add(int num1,int num2) {
while(num2 != 0){
int sum = num1 ^ num2; // 计算有单个1的位(0和0位不用计算了,1和1进位给下面操作了)
int carry = (num1 & num2) << 1; // 进位操作
num1 = sum;
num2 = carry;
}
return num1;
}