C語言學習筆記之位運算求餘

       我們都知道,求一個數被另一個數整除的餘數,可以用求餘運算符”%“,但是,如果不允許使用求餘運算符,又該怎麼辦呢?下面介紹一種方法,是通過位運算來求餘,但是注意:該方法只對除數是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)。       


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章