【发布时间】:2017-04-01 17:34:16
【问题描述】:
在我的bash 脚本中,我有一个包含十六进制数字的字符串,例如hex="0x12345678"。是否可以将其视为十六进制数字并对其进行位移?
【问题讨论】:
在我的bash 脚本中,我有一个包含十六进制数字的字符串,例如hex="0x12345678"。是否可以将其视为十六进制数字并对其进行位移?
【问题讨论】:
当然你可以进行按位运算(在arithmetic expansion 内):
$ echo "$((0x12345678 << 1))"
610839792
或者:
$ echo "$(( 16#12345678 << 1 ))"
610839792
值也可以设置在变量中:
$ var=0x12345678 # or var=16#12345678
$ echo "$(( var << 1 ))"
610839792
你可以做 OR、AND、XOR 和/或 NOT:
$ echo "$(( 0x123456 | 0x876543 ))"
9925975
还要得到十六进制的结果:
$ printf '%X\n' "$(( 0x12345678 | 0xDEADBEEF ))" # Bitwise OR
DEBDFEFF
$ printf '%X\n' "$(( 0x12345678 & 0xDEADBEEF ))" # Bitwise AND
12241668
$ printf '%X\n' "$(( 0x12345678 ^ 0xDEADBEEF ))" # Bitwise XOR
CC99E897
$ printf '%X\n' "$(( ~ 0x2C8B ))" # Bitwise NOT
FFFFFFFFFFFFD374
按位非 (~) 的唯一细节是它会翻转所有 可用 位。如果数字表示使用 64 位,则结果将具有 64 位。所有前导零位将被翻转为 1。
要限制这种转换,只需使用 AND:
$ printf '%X\n' "$(( ( ~ 0x2C8B ) & 0xFFFF ))"
D374
请注意,按位 NOT ~ 不是逻辑 NOT !。逻辑 NOT 仅将输入变为 0 或 1,而不是任何其他数字。
$ printf '%X\n' "$(( ! 0xdead ))" "$(( ! 0 ))"
0
1
【讨论】:
您可以在算术上下文中轻松对此类数字进行位移:
$ hex="0x12345678"
$ result=$((hex << 1))
$ printf "Result in hex notation: 0x%x\n" "$result"
0x2468acf0
【讨论】:
【讨论】: