以前學習java的時候,二進制和位運算只停留在"懂"的程度,從來沒有花時間去推導和總結,作為一個數學系的學生,一直想花點時間做推理證明
java和python關於二進制和位運算的規則差不多,這次就當是補償
一、符號約定
⌊p⌋:比p小的最大整數,稱為向下取整
⌈p⌉:比 p大的最小整數,稱為向上取整
xi:x在二進制下的第i位數
二、二進制表示
截取的 這位博主 的圖,推導過程使用求和公式來計算,思路差不多
n這樣理解:使得10n <= x 的最大的n值,bi的取值是一個集合
三、移位運算<< 和 >>
1、x,⌊x/2⌋,2x在二進制之間的關系
2、推導結論
結論一:x << k = 2kx
結論二: x >> k = ⌊x/2k⌋
結論三:二進制的遞推公式,這里理解下即可,python中用bin(n)函數可以直接打出n的二進制,如bin(123)打印為 0b1111011
這點同java的
Integer.toBinaryString(n),結果也是以0b開頭
四、按位運算
位運算符只能適用於整數,總體運算規則為:
首先把整數轉換為二進制表示形式,按最低位對齊,短的高位補0,然后進行位運算,最后把得到的二進制轉換為十進制結果
以下四種:&,|,^,~,分別是與,或,異或,取反
具體的例子就不說了,記幾個思路清奇的應用
1、判斷奇偶數
def isodd(x): return True if (x & 1) else False
2、求下標x和y的中間值
比如二分查找中的mid = (low+high) // 2 = (low+high) >>1
3、異或運算交換a和b的值
a ^= b b ^= a a ^= b
4、異或運算找出單身漢
在2N+1個自然數中,有N個數均出現2次,找出只出現1次的那個自然數
方案:所有數做異或計算,最終的結果就是要找的那個數