練習題2.13: 從20世紀70年代末到80年代末,digital equipment的vax計算機是一種非常流行的機型。它沒有布林運算and和or指令,只有bis(位設定)和bic(位清除)這兩種指令。只有bis(位設定)和bic(位清除)這兩種指令。兩種指令的輸入都是乙個資料字x和乙個掩碼字m。它們生成乙個結果z,z是由根據掩碼m的位來修改x的位來得到的。使用bis指令,這種修改就是在m為1的每個位置上,將z對應的位設定為1.使用bic指令,這種修改是在m為1的每個位置上,將z對應的位設定為0.
假設我們有兩個函式:bis和bic來實現位設定和位清除操作,用這兩個函式,不使用任何其他c語言運算,實現c語言的位級運算,寫出bis和bic運算的c語言表示式。
1.對bis和bic進行分析:/*declarations of functions implementing operations bis and bic*/
intbis
(int x,
int y)
;int
bic(
int x,
int y);/*
compute x|y using only calls to functions bis and bic*/
intbool_or
(int x,
int y)
/*compute x^y using only calls to functions bis and bic*/
intbool_xor
(int x,
int y)
/*compute x&y using only calls to functions bis and bic*/
intbool_and
(int x,
int y)
/*compute x&y using only calls to functions bis and bic*/
intbool_not
(int x,
int y)
bis指令:在m為1的每個位置上,將z對應的位設定為1.
bic指令,在m為1的每個位置上,將z對應的位設定為0.
bis(0,0)=0
bis(0,1)=1
bis(1,0)=1
bis(1,1)=1
由此可看出:bis指令的作用相當於|位運算
所以在求x|y是,可以填寫bis(x,y),完整的程式是:
bic(0,0)=0/*declarations of functions implementing operations bis and bic*/
intbool_or
(int x,
int y)
bic(0,1)=0
bic(1,0)=1
bic(1,1)=0
由於bic不屬於任何位運算級實現,所以可將bis和bic聯合起來進行使用。
2.將bis和bic聯合起來進行分析:bis(bic(x,y),bic(y,x))
bis(bis(0,0),bic(0,0))=0
bis(bic(0,1),bic(1,0))=1
bis(bic(1,0),bic(0,1))=1
bis(bic(1,1),bic(1,1))=0
由此可見,當x與y相異時,得到的值為1,相同時得到的值為0,符合位運算中異或的運算規則,所以可以得到完整**為:
3.將bis和bic聯合起來,並加入掩碼進行運算,完整的**為:/*compute x^y using only calls to functions bis and bic*/
intbool_xor
(int x,
int y)
掩碼應用舉例:/*compute x&y using only calls to functions bis and bic*/
intbool_and
(int x,
int y)
1.x=0x87654321,在32位的機器上,保留x的最低有效位元組,其他位都置為0。
c語言表示式:x&=0xff -> x=0x00000021
2.x=0x87654321,在32位的機器上,除了x的最低有效位外,其他的位都取補,最低有效位元組保持不變。
c語言表示式:x^=0xfffff00 -> x=0x789abc21
小技巧:
1.0^任何數=任何數
2.a^a=0
3.(a^ b)^a=b
4. 0xffffffff ^ 任何數 = ~ 任何數
4.將掩碼進行運算和bic聯合起來,完整的**為:
/*compute x&y using only calls to functions bis and bic*/
intbool_not
(int x)
C語言面試題 與 或 異或 取反 左移和右移
c語言面試題 與 或 異或 取反 左移和右移 位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按...
C語言位運算子 與 或 異或 取反 左移和右移
位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位的...
C語言位運算子 與 或 異或 取反 左移和右移
語言位運算子 與 或 異或 取反 左移和右移 位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按...