bic和bis實現或 與 取反 異或

2021-10-04 06:37:44 字數 2634 閱讀 7540

練習題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語言表示式。

/*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)

1.對bis和bic進行分析:

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),完整的程式是:

/*declarations of functions implementing operations bis and bic*/

intbool_or

(int x,

int y)

bic(0,0)=0

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,符合位運算中異或的運算規則,所以可以得到完整**為:

/*compute x^y using only calls to functions bis and bic*/

intbool_xor

(int x,

int y)

3.將bis和bic聯合起來,並加入掩碼進行運算,完整的**為:

/*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語言提供的位運算子列表 運算子 含義 描述 按...