CSAPP實驗之Data Lab:bang

編寫函數bang,函數要求:

bang - Compute !x without using !
Examples: bang(3) = 0, bang(0) = 1
Legal ops: ~ & ^ | + << >>
Max ops: 12
Rating: 4

我來說一下我的思路.
首先,這個函數的關鍵在於當x=0時輸出1,其餘情況輸出0.
因此我們唯一需要確定的是x是否等於0,即在32位的環境下32個二進制位全爲0.
我們可以採用"二進制統計法"來解決這個問題.
爲了方便我們這裏討論二進制數爲4位二進制數的情況.那麼我們要判斷4位二進制數是否爲0,我們可以先分半討論.即二分法.如下圖所示,我們先從左邊入手判斷左邊兩位是否全爲0.
在這裏插入圖片描述
我們知道,當第1位和第2位只有在全爲0的時候這兩個做或運算的結果爲0.
即當且僅當x1=0,x2=0,x1|x2=0.
我們可以相當清楚的看到,x2實際上是將x1向右移位得到的.即,我們可以得到以下表達式:
x=x|(x>>1) .
執行這個表達式時,只有在x1=0,x2=0的情況下執行結果中x2爲0.
之後我們可以逐級統計所有的二進制位以確定所有的二進制位都爲0.(如下圖)
在這裏插入圖片描述
如圖所示,若x4=0,則代表這這整個數爲0.
這樣,計算!x我們只需要取出取反後的x4即可.
下面貼出完整解題代碼:

int bang(int x) {
    x|=(x>>16);
    x|=(x>>8);
    x|=(x>>4);
    x|=(x>>2);
    x|=(x>>1);
    return (~x)&0x1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章