web-dev-qa-db-fra.com

Comment effectuer des opérations au niveau du bit sur des nombres hexadécimaux en bash?

Dans mon script bash, j'ai une chaîne contenant un nombre hexadécimal, par ex. hex="0x12345678". Est-il possible de le traiter comme un nombre hexadécimal et de faire un décalage de bits sur lui?

17
Jimmy Xu

Vous pouvez facilement décaler ces nombres dans un contexte arithmétique:

$ hex="0x12345678"
$ result=$((hex << 1))
$ printf "Result in hex notation: 0x%x\n" "$result"
0x2468acf0
14
that other guy

Bien sûr, vous pouvez effectuer des opérations au niveau du bit (à l'intérieur d'une extension arithmétique):

$ echo "$((0x12345678 << 1))"
610839792

Ou:

$ echo "$(( 16#12345678 << 1 ))"
610839792

La valeur peut également être définie dans une variable:

$ var=0x12345678         # or var=16#12345678
$ echo "$(( var << 1 ))"
610839792

Et vous pouvez faire OR, AND et XOR:

$ echo "$(( 0x123456 | 0x876543 ))"
9925975

Et pour obtenir le résultat en hex également:

$ printf '%X\n' "$(( 0x12345678 | 0xDEADBEEF ))"     # Bitwise OR
DEBDFEFF

$ printf '%X\n' "$(( 0x12345678 & 0xDEADBEEF ))"     # Bitwise AND
12241668

$ printf '%X\n' "$(( 0x12345678 ^ 0xDEADBEEF ))"     # Bitwise XOR
CC99E897
16
sorontar

Oui .

Les expressions arithmétiques prennent en charge les nombres de base 16 et tous les opérateurs C habituels.

Exemple:

$ hex="0xff"
$ echo $(( hex >> 1 ))
127
2
Adrian Frühwirth