我們都知道,求乙個數被另乙個數整除的餘數,可以用求餘運算子」%「,但是,如果不允許使用求餘運算子,又該怎麼辦呢?下面介紹一種方法,是通過位運算來求餘,但是注意:該方法只對除數是2的n次方冪時才有效。
在移位運算中我們可知,計算機中的資料都是0和1的序列,當我們把某個數字左移一位,該數字會擴大為原來的2倍;而將其右移一位時,該數字就會縮小為原來的1/2,即相當於對該數字做了一次被2整除的運算。
舉例說明:
11的二進位制是1011,如果右移一位的話,將變成0101,也就是5。
現在我們考慮11除以8的餘數,很顯然是3;因為8是2的3次冪,求余時相當於除以2的3次冪,也就是把1011右移3位,該過程會把1011的低3位011給移走,事實上,這個被移走的011就是11除以8的餘數!但是,我們該如何把這個011給儲存下來呢?
現在的問題就轉化為如何儲存11的二進位制1011的低三位數字了——這時就是按位與運算出馬的時候了!和1做與運算會儲存原來的數字,所以我們就可以用1011&0111來計算。那麼這個0111又是如何得到的呢?有兩種方法,第一種是2^n-1,比如8按照此公式就得出了0111;第二種是8的二進位製取反,即1000取反得到0111。
綜上所述,位運算求餘一定要注意,只適合於除數是2的n次方的情況。其原理就是:對2的n次方求餘,就預示著數字將向右移n位;這被右移的n位,就是餘數!只要我們再用與運算將這n位儲存下來即可!
設x對y求餘,y等於2^n,公式為:x & (2^n - 1)或x&(~y)。
c語言小技巧 C語言學習筆記之位運算求餘
我們都知道,求乙個數被另乙個數整除的餘數,可以用求餘運算子 但是,如果不 允許使用求餘運算子,又該怎麼辦呢?下面介紹一種方法,是通過位運算來求餘,但是注 意 該方法只對除數是2的n次方冪時才有效。在移位運算中我們可知,計算機中的資料都是0和1的序列,當我們把某個數字左 移一位,該數字會擴大為原來的2...
c語言位運算 C語言學習筆記(二)位運算
這一節主要說的是位運算,計算機中的執行速度 位運算 加減 乘除 求餘 位運算就是將數字轉換成二進位制後進行運算,之後再將數字轉換成原來的進製 與運算 當兩個數相與時,只有都為l的時候結果才為1,其餘情況結果都為0,符號 include int main 這個程式可以判斷a是偶數還是奇數,輸出為1說明...
C語言學習 位運算
原碼 就是前面所介紹的二進位制定點表示法,即最高位為符號位,0 表示正,1 表示負,其餘位表示數值的大小。反碼 表示法規定 正數的反碼與其原碼相同 負數的反碼是對其原碼逐位取反,但符號位除外。補碼 表示法規定 正數的補碼與其原碼相同 負數的補碼是在其反碼的末位加 1 補碼是為了表示乙個負數的二進位制...