Programación de la operación knowledge_endian_bit

1. Endianidad

Poco conocimiento adicional
1Tbyte = 1024Gbyte,
1Gbyte = 1024Mbyte,
1Mbyte = 1024Kbyte, (1Mb = 1024x1024 bytes)
1Kbyte = 1024byte, (1KB = 1024 bytes)
1byte = 8bit (un byte consta de 8 bits binarios)
int i; el tipo int ocupa 4 bytes, lo que significa 4x8 = 32 bits (el número máximo que se puede representar es 2 ^ 31-1 = 2147483647)
doble i; el tipo doble ocupa 8 bytes, lo que significa 8 * 8 = 64 bits Bits (el número máximo que se puede representado es 2 ^ 63-1)
Además: lo que vemos a menudo es int i = 0xff, es decir, solo hay dos ffs después de 0x, que es omitir los seis 00 00 00 delante de ff Zero, que significa que el original int i = 0x000000ff, debido a que el significado de 0xff = 0x000000ff es el mismo, los principiantes deben prestar atención.

Suponga int a = 0x12345678;que cada número hexadecimal ocupa 4 bits; en la memoria, 8 bits se utilizan como 1 byte. Por lo tanto 0x12345678, cada dos bits se consideran 1 byte, donde 0x78 es el byte bajo y 0x12 es el byte alto.
Hay dos métodos de almacenamiento en la memoria:

0x12345678el bit bajo (0x78) tiene una dirección baja, es decir, el modo 1, llamado little endian;
0x12345678el bit alto (0x12) tiene una dirección baja, es decir, el modo 2, llamado orden de bytes grandes ( Big endian);

Los chips de brazo generales están en little endian, algunos procesadores pueden establecer un cierto registro para que todo el sistema utilice big endian o little endian. Little-endian y big-endian lo llamamos modo big-endian y modo little-endian. De hecho, el significado de hacerse más grande es el mismo.

2. Manipulación de bits

2.1 Cambio lógico

En el desarrollo incrustado, solo involucramos cambios lógicos: no nos importa el bit de signo, todos son
cambios aritméticos llenos de ceros , que deben dividirse en valores con y sin signo:

  • Para valores sin signo, el desplazamiento aritmético es equivalente al desplazamiento lógico.
  • Para valores con signo, el desplazamiento aritmético a la izquierda es equivalente al desplazamiento lógico a la izquierda; el desplazamiento aritmético a la derecha complementa el bit de signo, más 0 para números positivos y 1 para números negativos.

2.1.1 Desplazamiento lógico a la izquierda

int a = 0x123;  int b = a<<2;  // b=0x48C

2.1.2 Desplazamiento lógico a la derecha

int a = 0x123;  int b = a>>2; // b=0x48

2.2 Invertir

unsigned int   a = 0x123;
unsigned int   b = ~a;   // b的每一位,都是a对应位的取反

2,3 bits y

unsigned int a = 0x123;
unsigned int b = 0x456;
unsigned int c = a & b; // c等于a位与b,即:a,b的每一位进行与操作

Los dos son AND, y los resultados son los siguientes:

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

Por lo tanto, el resultado del código de lenguaje C anterior se muestra en la siguiente figura:

2,4 dígitos o

unsigned int a = 0x123;
unsigned int b = 0x456;
unsigned int c = a | b; // c等于a位或b,即:a,b的每一位进行或操作

Los dos bits se colocan en OR y los resultados son los siguientes:

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

Por lo tanto, el resultado del código de lenguaje C anterior se muestra en la siguiente figura:

2.5 Establecer

unsigned int a = 0x123;
unsigned int b = a | (1<<7) | (1<<8);  // 设置a的bit7, bit8, 赋给b

2.6 Compensación

unsigned int a = 0x123;
unsigned int b = a & ~((1<<7) | (1<<8));  // 清除a的bit7, bit8, 赋给b

2.7 Establecer ciertos bits a un cierto valor

Por ejemplo, para establecer el bit7 en 1 y borrar el bit8 en 0, esto se puede hacer en dos pasos: primero establecer el bit7 y luego borrar el bit8. Hay otra situación: bit [8: 7] = val, no sé cuál es el valor de val, ¿qué debo hacer? Primero borre bit8, bit7 y luego agregue val, el código es el siguiente:

unsigned int a = 0x123;
unsigned int b = a & ~(3<<7);  /* 清除bit7, bit8 */
b = b | (val << 7);            /* 设置bit7, bit8为val */

Supongo que te gusta

Origin blog.csdn.net/qq_39400113/article/details/109562520
Recomendado
Clasificación