c 中位運算的一些總結

2021-09-01 23:55:35 字數 1218 閱讀 8964

倘如我們要算a

ba^b

ab,平常只能想到跑乙個for迴圈,乙個乙個的累乘。然而我們可以利用二進位制的思想將b拆開。例:b為11,可拆成(23

+21+

20

)(2^3+2^1+2^0)

(23+21

+20)

這樣a

ba^b

ab就等於a23

∗a21

∗a20

a^*a^*a^

a23∗a2

1∗a2

0然後我們可以跑乙個while,在b的二進位制為一的位上乘上相應的a的冪即為答案。

int

quick_pow

(int a,

int b,

int mod)

//快速冪

return c;

}

跟快速冪同樣的思想。我們有a∗b

a*ba∗

b,正常計算耗時慢還可能溢位,所以我們可以使用快速乘。若b是11,我們將b拆成(23

+21+

20

)(2^3+2^1+2^0)

(23+21

+20)

,那麼a∗b

a*ba∗

b為:( a∗

23+a

∗21+

a∗20

)(a*2^3+a*2^1+a*2^0)

(a∗23+

a∗21

+a∗2

0),同樣道理,我們在b的二進位制為一的位上加上a的倍數就行。

int

quick_mult

(int a,

int b,

int mod)

//快速乘

return c;

}

異或操作,比較二進位制中對應的位,同0異1。也叫xor。

我們知道,如果不同位為1且相同位為0,其實相當於兩個數求和,但不進製。即不進製的加法。那我們如何用異或來進行進製加法呢。可以用到&。用&來算出兩個數的相同位,然後左移一位表示進製之後的結果。剩下的也就是算(a^b)+(a&b)。我們可以在這裡進行遞迴,直到b為0時,加無可加。解釋遞迴。

int

xor_add

(int num1,

int num2)

//異或求和

一些位運算

該篇文章會持續更新將遇到的位運算在這進行解釋 1.按位與 運算 運算規則 0 0 0 0 1 0 1 0 0 1 1 1 例如 8的二進位制 00001000 5的二進位制 00000101 8 5 0000 0000 轉換成十進位制就是0 與運算 的特殊用途 1 清零。如果想將乙個單元清零,即使其...

位運算中的一些技巧

方法一 利用位運算交換兩個數 a a b b a b 右邊等價於a b b a a a b 此時b a 此式右邊等於a b a b方法二 需要考慮a b會不會超過a表達的數值範圍,導致記憶體溢位 a a b b a b 右邊等價於a b b a a a b 此時b等於a,右邊等價於a b a bin...

位運算的一些總結和技巧

引子 程式設計師面試寶典 2c的p37的面試例題中有這樣一道題 unsigned chara oxa5 unsigned charb a 4 printf d b 書上給的答案是正確的,但是講解是錯誤的 的優先順序高於 這個題作者之所以能夠歪打正著的作對最後的結果,是因為在位運算中,不存8位的位運算...