【问题标题】:How to perform bitwise operations on hexadecimal numbers in bash?如何在bash中对十六进制数执行按位运算?
【发布时间】:2017-04-01 17:34:16
【问题描述】:

在我的bash 脚本中,我有一个包含十六进制数字的字符串,例如hex="0x12345678"。是否可以将其视为十六进制数字并对其进行位移?

【问题讨论】:

    标签: bash shell sh


    【解决方案1】:

    当然你可以进行按位运算(在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
    

    【讨论】:

      【解决方案2】:

      您可以在算术上下文中轻松对此类数字进行位移:

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

      【讨论】:

        【解决方案3】:

        Yes.

        算术表达式支持以 16 为底的数字和所有常用的 C 运算符。

        例子:

        $ hex="0xff"
        $ echo $(( hex >> 1 ))
        127
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-30
          • 2016-06-12
          • 2013-06-26
          • 1970-01-01
          • 2012-09-12
          • 2020-09-25
          • 2012-06-13
          相关资源
          最近更新 更多