我很好奇,究竟下面的對比呢,儘可能詳細越好,特別是涉及到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