代码之家  ›  专栏  ›  技术社区  ›  TJ L

算术运算中的“与”号和Bash中带x的数字是什么意思?

  •  3
  • TJ L  · 技术社区  · 14 年前

    我很好奇下面的比较到底做了什么,尽可能详细,尤其是关于 0x2 以及 &

    if [ $((${nValid} & 0x1)) -eq 1 ]; then
      #...snip...
    fi
    
    if [ $((${nValid} & 0x2)) -eq 2 ]; then
      #...snip...
    fi
    
    5 回复  |  直到 13 年前
        1
  •  2
  •   palswim    14 年前

    按位 AND 操作员( & )意味着一点一点,操作员将执行 比较。因此,如果nValid是一个字节(8位)值,请查看二进制操作:

    nValue & 0b00000001
    

    (nValue = 0b00101010) & 0b00000001 => 0b00000000 // (does not have the last bit set)
    (nValue & 0b00000001) == 0b00000001 // false
    

    第二天呢( nValid & 0x2 )

    (nValue = 0b00101010) & 0b00000010 => 0b00000010 // (has the 2nd-to-last bit set)
    (nValue & 0b00000010) == 0b00000010 // true
    

    这对于测试变量中的标志非常有用;通常使用 通过隔离位和 OR 合并标志。

    0b00001000 | 0b00000010 | 0b00000001 => 0b00001011
    
        2
  •  3
  •   dave    14 年前

    &是按位AND运算符。所以您要求在0x1和${nVAlid}返回的值之间执行位“与”。

    有关位操作的更多信息,请参见 here.

        3
  •  3
  •   pavanlimo    14 年前

    shell脚本将数字解释为十进制(以10为基数),除非该数字有特殊的前缀或表示法。以0开头的数字是八进制(以8为基数)。以0x开头的数字是十六进制(以16为基数)。嵌入#的数字计算为基#数(有范围和符号限制)。

    [ $((${nValid} & 0x1)) -eq 1 ] , $nValid 与…有关 0x1 并与十进制进行了比较 1

    阅读 this this

        4
  •  2
  •   DarkDust    14 年前

    0x1 0x2 是1和2的十六进制符号。这个 &

    方案如下(C表示法):

    if (val & (1 << bitNumber) == (1 << bitNumber)) {
      // The bit at position bitNumber (from least to most significant digit) is set
    }
    

    这个 << 1 << 0 == 1 , 1 << 1 == 2 , 1 << 2 == 4

    因此,为了更好的可读性,这些行应该更像:

    if [ $((${nValid} & X)) -eq X ]; then
    

    其中X是2的幂(而不是十六进制和十进制混合表示法)。

        5
  •  2
  •   Dennis Williamson    14 年前

    可以改写为:

    if (( nValid & 2#00000001 )); then
      #...snip...
    fi
    
    if (( nValid & 2#00000010 )); then
      #...snip...
    fi
    

    选择最适合上下文的二进制位数。如果只检查一个位*,则不必测试是否相等。如果有意义的话,您仍然可以使用十六进制表示。在这种情况下,大括号和美元符号是不必要的。

    您可能希望使用具有有意义名称的常量,而不是硬编码的值:

    declare -r FOO=$((2#00000001))
    declare -r BAR=$((2#00000010))
    if (( nValid & FOO )); then
      #...snip...
    fi
    if (( nValid & BAR )); then
      #...snip...
    fi
    

    *如果同时测试多个位,则需要测试是否相等:

    if (( (nValid & (FOO | BAR)) == (FOO | BAR) )); then
      #...snip...
    fi
    

    == 具有比按位运算符更高的优先级。

    (( var |= FOO ))    # set the bits in FOO into var
    (( var &= ~BAR ))   # clear the bits in BAR from var