先來看leetcode-29上的divide two integers題目要求:
divide two integers without using multiplication, division and mod operator.
if it is overflow, return max_int.
就是說不用乘法,除法,求模運算來實現兩個整數相除。如果溢位,返回max_int。看起來很簡單,我可以用除數減去被除數,直到除數小於被除數,記錄減法操作的次數即可。假設是計算m/n,那麼時間複雜度為o(m/n)。用python實現後,time limit exceeded。我們考慮有沒有更加優化的演算法呢?
如果很難想得到,那就先來回憶下二進位制數按位運算
的一些知識。
二進位制數按位運算
計算機裡面所有資料都儲存為0,1
串,所有的運算歸根到底都轉為二進位制數的運算。相信大家都知道二進位制數按位運算的規則:
來看一些簡單的例子:
1010 & 1100 = 1000
1010 | 1100 = 1110
1010 ^ 1100 = 0110
1010
<< 2 = 101000
1010 >> 2 = 10
~1010 = 0101
單純的二進位制位之間的這些運算相當簡單,但對我們實際程式設計並沒有直接幫助,因為程式設計過程中需要的經常是數字間的運算,比如 5*(2^4) 。真的是這樣嗎?接著往下看!
計算機中數字的儲存方式
我們都知道計算機中萬物皆為0、1,將萬物變為0、1的過程叫做編碼,這裡我們只討論將數字編碼為0、1的過程。
計算機中對數字的表示有三種方式:原碼,反碼,補碼
:
原碼容易被人腦直接識別並用於計算,但是對於計算機來說並不友好。所以在計算機系統中,數值一律用補碼來表示、運算和儲存。使用補碼,可以將符號位和數值域統一處理,將加法和減法統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。
數字的按位運算
計算機中數字儲存為補碼
形式,各個數之間的運算也是對它們的補碼做運算,而且得到的結果也是補碼,如下圖:
各種程式語言都提供了對補碼的二進位制位直接進行運算的方法。以python為例:
上面0b開頭的0、1串表示整型數字,在32位作業系統中,python中int型別一般佔32個二進位制位,以最後乙個求反運算為例子,1010的補碼為
00000000
00000000
00000000
00001010
求反操作後為:
11111111
11111111
11111111
11110101
即為-11(原碼為:10000000 00000000 00000000 00001011)的補碼。(對乙個數的補碼求補碼即可得到該數的原碼)
另闢蹊蹺的按位運算
那麼按位運算在實際程式設計中可以扮演哪些角色呢?簡單點地,可以用來判斷奇、偶數:num & 0x1,或者對乙個數變換符號:~num + 1;複雜點的可以用來交換兩個數,求絕對值等等。
1、 不用額外的變數實現兩個數字互換。
# coding: utf-8
defswap
(num_1, num_2):
num_1 ^= num_2
num_2 ^= num_1
num_1 ^= num_2
return num_1, num_2
num1 = 5
num2 = 3
print
u'交換前','----',num1, num2
num1, num2 = swap(num1, num2)
print
u'交換後','----',num1, num2
證明很簡單,我們只需要明白異或運算滿足下面規律:
0^a=a
a^a=0
a^b^c=a^c^b
def
bit_abs
(value):
return (value ^ (value >> 31)) - (value >> 31)
print(bit_abs(-100))
python的按位運算
華電北風吹 天津大學認知科學與計算重點實驗室 最後修改日期 2015 8 6 python提供了豐富的位運算操作符,例如按位與,按位或,按位異或,左移位,右移位和取反操作,例子 如下 a,b 45,83 bin a bin b 0b101101 0b1010011 a b,bin a b 127,0...
python中的按位運算
常見的按位運算有 按位與運算 print 5 0xf print 5 0xf 結果為 115由上可知 python中進行按位與運算結果必然是正數,最高位是符號位的特質消失。主要是限定變數的位數 因為python中沒有int long來限制位數 按位或運算 print 5 0xf print 5 0x...
python 中的按位運算
1 按位運算子是把數字看作二進位制來進行計算的。python 的內建函式 bin 可已將乙個整數數值轉換成相應的二進位制值。示例 2 按位與 參與運算的兩個值,如果其二進位制值對應位都為1,則該位的結果為1,否則該位為 0 示例 3 按位或 只要對應的二個二進位有乙個為 1 時,結果位就為 1,只有...