c語言小技巧 C語言學習筆記之位運算求餘

2022-09-06 20:36:09 字數 812 閱讀 4046

我們都知道,求乙個數被另乙個數整除的餘數,可以用求餘運算子」%「,但是,如果不

允許使用求餘運算子,又該怎麼辦呢?下面介紹一種方法,是通過位運算來求餘,但是注

意:該方法只對除數是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語言學習小筆記

20190411 從路徑名中分離檔名 給字元陣列賦值的方法 陣列初始化以後,不能直接對陣列賦值,可以通過函式strcpy 和memcpy 拷貝賦值。strrchr 函式 strcpy函式和strcat函式 輸出到檔案時按列對齊的小技巧 char a world fprintf printfile,1...

C語言學習筆記 位域

如果程式的結構中包含多個開關量,只有 true false 變數,如下 struct status 此種結構需要 8 位元組的記憶體空間,但在實際上,在每個變數中,我們只儲存 0 或 1。在這種情況下,c 語言提供了一種更好的利用記憶體空間的方式。struct status 現在,上面的結構中,st...

c語言位運算 C語言學習筆記(二)位運算

這一節主要說的是位運算,計算機中的執行速度 位運算 加減 乘除 求餘 位運算就是將數字轉換成二進位制後進行運算,之後再將數字轉換成原來的進製 與運算 當兩個數相與時,只有都為l的時候結果才為1,其餘情況結果都為0,符號 include int main 這個程式可以判斷a是偶數還是奇數,輸出為1說明...