神奇的按位運算 python

2021-08-25 05:35:23 字數 2477 閱讀 1677

先來看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,只有...