2010-08-17 54 views

回答

2

它正在逐位测试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 
3

&是按位与运算。所以你要求做一个按位,在0x1和$ {nVAlid}返回的值之间。

有关逐位操作的更多信息看here.

3

甲壳脚本解译数为十进制(底为10),但该数目具有特殊前缀或符号。前面加上0的数字是八进制数(基数8)。前面加上0x的数字是十六进制(基数为16)。具有嵌入#的数字评估为BASE#NUMBER(具有范围和符号限制)。

因此,在[ $((${nValid} & 0x1)) -eq 1 ],$nValid0x1和与小数1比较。同样也是第二次比较。

阅读thisthis详细信息。

+0

你能描述当 “'$ nValid'与'0x1'相与” 发生了什么? – tj111 2010-08-17 16:39:22

+0

@ tj111:请参见以下链接: http://en.wikipedia.org/wiki/Binary_and http://en.wikipedia.org/wiki/Bitwise_operation – DarkDust 2010-08-17 16:42:38

+1

的价值最后是以二进制来表示,所以假定'$ “二进制中的nValid”表示为“1001”,“0x1”为“0001”,这两者的“&”操作将导致:“0001”。请参阅http://en.wikipedia.org/wiki/Bitwise_operation – pavanlimo 2010-08-17 16:46:49

2

0x10x2是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 == 11 << 1 == 21 << 2 == 4 ...

所以为了更好的可读性线应该更像:

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

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

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 
相关问题