倘如我們要算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位的位運算...