Cómo realizar operaciones bit a bit en el shell
$((...))
$ 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