Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo realizar operaciones bit a bit en el shell

Cómo realizar operaciones bit a bit en el shell

Sintaxis

$((...))

$ echo $(( 3 * 4 ))12

Es particularmente conveniente en algunos casos y guarda Deshazte de la molestia de escribir un programa, como verificar ciertas operaciones.

El siguiente ejemplo demuestra el ejercicio 2.12 de "Comprensión de los sistemas informáticos"

La expresión ~0 generará una máscara todo 1, independientemente del tamaño de palabra de la máquina, y es portátil.

El comando printf de Shell puede guiar la impresión de caracteres: Shell Script Learning Guide", Tabla 7-4: Las banderas de printf describen el significado del signo "#" en los parámetros de formato, y "#" puede ser se utiliza para generar palabras iniciales" 0x" (hexadecimal), "0" (octal)

x & 0xFF. 0xFF El valor generado contiene el byte menos significativo de x

$ printf "%#x\n" $(( 0x89ABCDEF & 0xFF ))0xef

$ printf "%#.8x \n" $(( 0x89ABCDEF & 0xFF ))0x000000ef

El siguiente x = 0x87654321

El byte menos significativo de A. x, todos los demás bits establecidos en 0

$ printf "%#.8x\n" $(( 0x87654321 & 0xFF ))0x00000021

$ printf "%#.8x\n " $(( 0x87654321 & ?0xFF ))-bash: 0x87654321 & ?0xFF : error de sintaxis: operando esperado (el token de error es "?0xFF")

La respuesta a la pregunta del ejercicio dada en el libro es " x & ?0xFF ", se verifica el número "? " que contiene y el shell no se puede ejecutar correctamente.

B. Excepto por el byte menos significativo de x, tome el complemento de todas las posiciones y el byte menos significativo permanece sin cambios.

$ printf "%#x" $(( 0x87654321 ^ ~0xff))0xffffffffffffffffff789abc21

Los resultados anteriores son algo diferentes de lo esperado, porque ~0xff generará una máscara de 64 bits , pero los últimos 32 bits son los esperados.

El byte menos significativo de C.x se establece en todos unos, el resto de bytes permanecen sin cambios.

$ printf "%#x" $(( 0x87654321 | 0xff ))0x876543ff