2010-08-17 26 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 
相關問題