1. 程式人生 > >用bis和bic實現位級操作

用bis和bic實現位級操作

www. -c fff 最簡 規則 bool 異或 -s 生成

轉載於 https://www.cnblogs.com/tlnshuju/p/7102021.html

20世紀70年代末至80年代末,DigitalEquipment的VAX計算機是一種非常流行的機型。它沒有布爾運算AND和OR指令,僅僅有bis(位設置)和bic(位清除)這兩種指令。兩種指令的輸入都是一個數據字x和一個掩碼字m。

他們生成一個結果z。z是有依據掩碼m的位來改動x的位得到的。使用bis指令。能夠在m為1的每一個位置上,將z相應的位置設為1。

使用bic指令。能夠在m為1的每一個位置上,將z相應的位置設為0。
為了弄清bis和bic運算與C語言位級運算的關系,如果我們有兩個函數bis和bic來實現位設置和位清除操作。僅僅想用這兩個函數,而不使用不論什麽其它C語言運算,來實現按位|和^運算,即或運算和異或運算。
bis等價於or,bic(x,m)等價於x&~m。
x^y=(x&~y)|(~x&y) 示比例如以下: /*定義兩個運算函數*/ int bis(intx, int m); intbic(int x, int m); /*或運算的實現*/ intbool_or(int x, int y){ int result = _______; return result; } /*異或運算的實現*/int bool_xor(int x, int y){ int result = ______; return result; } 首先來看或(OR)運算的實現。先簡單分析下bis運算的功能: 由給出的規則。能夠得出例如以下演示樣例: bis([1001],[0110])= [1111]; bis([01010101],[10011011])=[11011111]; 能夠得出。對於掩碼m中為1的位,不管x為0或1。結果均為1,對於掩碼m中位0的位,結果保持為x的值。即x為1時。結果為1,x為0時。結果為0。 這個與C語言中位級運算的或運算非常相似。所以或運算相應的結果即bis(x,y); 異或運算的結果有些復雜,先來看一下其它的稍簡單的幾個位級運算。 位取反運算(~) 假設要對x取反。需將0置為1,1置為0。bic函數當掩碼為1時,可將結果該位置0,當掩碼為0時,保持x值置結果該位。所以能夠把x作為掩碼,把全高位值0xFFFF作為bic函數的第一個參數。就可以對x取反。取反運算的函數能夠表演示樣例如以下: int bool_not(int x){ int result =bic(0xFFFF,x); //此處討論的為16位機 return result; } 與運算(AND) 由布爾代數可知:x& y = ~(~x | ~y),所以由剛得出的取反運算函數。可得出與運算的函數: int bool_and(int x, int y){ int result =bic(0xFFFF,bis(bic(0xFFFF,x),bic(0xFFFF, y)); return result; } 以下探討下位異或運算(XOR): 異或運算,僅僅有當兩個位不同一時候。結果才為1。 用1位數位能夠表示成例如以下演示樣例: 0^0= 0 0^1 = 1 1^0 = 1 1^1 = 0 相同用1位數位表示最簡單的bis和bic函數。能夠得出以下8個公式。這對於後面的分析非常實用: bis(0,0)= 0 bis(0,1)= 1
bis(1,0) = 1 bis(1,1)= 1 bic(0,0) = 0 bic(0,1)= 0  bic(1,0) = 1 bic(1,1)= 0 註意上面標紅的幾個式子,恰好能夠被我們利用: 對於bis函數。當兩個位不同一時候,結果為1。而bic函數卻取決於掩碼的數值。對於bic函數,當兩個位同樣時。結果為0。所以能夠得出以下幾個式子: bis(bic(0,1),bic(1,0))=bis(0,1)=1 bis(bic(1,0),bic(0,1))= bis(1,0)= 1 bis(bic(0,0),bic(0,0))= bis(0,0)= 0 bis(bic(1,1),bic(1,1))= bis(0,0)= 0 這就是對於(0,1)、(1,0)、(0,0)和(1,1)四對數位的異或運算結果。所以異或運算可寫成例如以下形式: int bool_xor(int x, int y){ int result =bis(bic(x,y),bic(y,x)); return result; }

用bis和bic實現位級操作