shell算術展開、按位運算

《shell腳本學習指南》6.1.3節描述了shell的算術展開,其支持的運算與C語言差很少,語法
$((...))

shell

$ echo $(( 3 * 4 )) 
12

在某些場景特別方便,能夠免去寫程序的煩瑣,如驗證某些運算。
下面是驗證《深刻理解計算系統》練習題2.12的場景

表達式 ~0 將生成一個全1的掩碼,無論機器的字大小是多少,可移植。
bash

$ printf "%x\n" $(( ~0 ))
ffffffffffffffff
$ printf "%#x\n" $(( ~0 ))
0xffffffffffffffff
上面的測試顯示,shell中,0按位取反後的值是64位的。
shell的printf命令前導字符打印:《shell腳本學習指南》表7-4:printf的標誌中描述了格式參數中"#"號的意義,"#"能夠用以輸出前導"0x"(16進制)、"0"(8進制)

x & 0xFF 生成一個由x的最低有效字節組成的值
$ printf "%#x\n" $(( 0x89ABCDEF & 0xFF ))
0xef
$ printf "%#.8x\n" $(( 0x89ABCDEF & 0xFF ))
0x000000ef

如下x = 0x87654321
A.x的最低有效字節,其餘位均置爲0
$ printf "%#.8x\n" $(( 0x87654321 & 0xFF ))       
0x00000021
$ printf "%#.8x\n" $(( 0x87654321 & ?0xFF ))
-bash: 0x87654321 & ?0xFF : syntax error: operand expected (error token is "?0xFF ")
書中給出的練習題的答案是 「x & ?0xFF」,這裏的"?"號經驗證,shell沒法正確運行。

B.除了x的最低有效字節外,其餘的位置都取補,最低有效字節保持不變。
$ printf "%#x" $(( 0x87654321 ^ ~0xff))
0xffffffff789abc21
上面由於~0xff會生成64位的掩碼,因此結果有些不符合預期,但後32位是符合預期的。


C.x的最低有效字節設置成全1,其餘字節都保持不變。ide

$ printf "%#x" $(( 0x87654321 | 0xff ))
0x876543ff
相關文章
相關標籤/搜索