我很好奇,究竟下面的对比呢,尽可能详细越好,特别是涉及到0x2
和&
字符,正是他们做什么,算术评估中的和号与x在Bash中的含义是什么?
if [ $((${nValid} & 0x1)) -eq 1 ]; then
#...snip...
fi
if [ $((${nValid} & 0x2)) -eq 2 ]; then
#...snip...
fi
我很好奇,究竟下面的对比呢,尽可能详细越好,特别是涉及到0x2
和&
字符,正是他们做什么,算术评估中的和号与x在Bash中的含义是什么?
if [ $((${nValid} & 0x1)) -eq 1 ]; then
#...snip...
fi
if [ $((${nValid} & 0x2)) -eq 2 ]; then
#...snip...
fi
它正在逐位测试nValid。
按位AND
运算符(&
)表示按位运算符将执行AND
比较。所以,如果NVALID是一个字节(8位)值,然后看操作二进制:
nValue & 0b00000001
如果n值是42,则操作是这样的
(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
这是为变量内测试标志有用;通常使用AND
通过隔离位来检查标志,并使用OR
来组合标志。
0b00001000 | 0b00000010 | 0b00000001 => 0b00001011
&是按位与运算。所以你要求做一个按位,在0x1和$ {nVAlid}返回的值之间。
有关逐位操作的更多信息看here.
0x1
和0x2
是1和2的十六进制符号。&
是按位AND运算符。这些行做的是测试nValid中的值是否设置了最低有效位(0x1)和次最低有效位(0x2)。
该方案是这样的(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的幂(而不是混合十进制和十六进制表示法)。
这可能被重写为:与选择为最适合于上下文的二进制数字数量
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
你能描述当 “'$ nValid'与'0x1'相与” 发生了什么? – tj111 2010-08-17 16:39:22
@ tj111:请参见以下链接: http://en.wikipedia.org/wiki/Binary_and http://en.wikipedia.org/wiki/Bitwise_operation – DarkDust 2010-08-17 16:42:38
的价值最后是以二进制来表示,所以假定'$ “二进制中的nValid”表示为“1001”,“0x1”为“0001”,这两者的“&”操作将导致:“0001”。请参阅http://en.wikipedia.org/wiki/Bitwise_operation – pavanlimo 2010-08-17 16:46:49