天天看點

python中算術位移運算

python中有一種位運算——算術位移運算,符号是<<或>>,算術位運算是基于補碼的基礎上進行的,正數的補碼是正數本身,而負數的補碼就比較複雜,先把寫出正數的二進制,然後取反,再末尾加1。總而言之,不管是什麼進制的數先把它轉換成二進制,然後再進行位移。先來一段代碼。

# 左移(補0)           m<<n ---> m*2的n次方
# 右移(補位看符号位)   m>>n ---> m//2的n次方  
print(2<<1)   #4

print(2>>1)   #1
           

來一個具體計算的示意圖:

python中算術位移運算

左移:先把二進制寫出來,現在的計算機都是什麼32位,64位啥的,不嫌多的話寫上32位的二進制,不想寫那麼多的就寫個8位的二進制。想像一下,在這個二進制前面有一個黑洞,左移就是把這個二進制一位一位的往左邊那個黑洞推,推進去的那一位就被吃了,這就導緻位數不夠了,我們就在這個二進制的右端補0呗,被吃了幾位就補幾位。

右移:和左移類似隻不過黑洞就在了右邊,往右推二進制,在二進制的左邊補位,補什麼呢,這就看這個數的符号位(第一位)了。

舉個簡單的栗子:

python中算術位移運算

我們要記住的是!!!:在數字沒有溢出的前提下,對于正數和負數,左移以為都相當于乘以2的1次方,左移n位就相當于乘以2的n次方;右移一位相當于除以2,右移n位相當于除以2的n次方,這裡取的是商,不要餘數。正數右移的最小結果是0,負數右移最小是-1

這個時候我們就來練習一下:

1.64<<2 =?

把64轉換成二進制0000 0000 0000 0000 0000 0000 0100 0000

左移就是左邊少兩位,右端多兩個0。就變成了

0000 0000 0000 0000 0000 0001 0000 0000 轉換成十進制就是256

是不是等于6422呢?

2.-64<<2

碰到負數我們先把負數轉換成它的二進制的補碼,-64的二進制補碼就是

1111 1111 1111 1111 1111 1111 1100 0000 之後就是左邊少兩位,右端多兩個0,就變成了1111 1111 1111 1111 1111 1111 0000 0000 這個就是結果的二進制補碼,我們再把他轉成10進制的,怎麼轉呢?先看首位是1,就知道這是個負數。然後末尾減1,得1111 1111 1111 1111 1111 1110 1111 1111 再取反得

0000 0000 0000 0000 0000 0001 0000 0000 這個數是多少呢?這不就是256嘛,再加上負号,結果就是-256。

3.-64>>2

-64的二進制補碼怎麼得到的呢?64的二進制

0000 0000 0000 0000 0000 0000 0100 0000 取反得

1111 1111 1111 1111 1111 1111 1011 1111 再末尾加1得

1111 1111 1111 1111 1111 1111 1100 0000 這就是-64的二進制補碼。

右移就是往右推二進制,在二進制的左邊補位,那麼得到的是

1111 1111 1111 1111 1111 1111 1111 0000 這個就是結果的二進制補碼,接下來轉成10進制,首位是1那麼就是個負數,然後末尾取減1得

1111 1111 1111 1111 1111 1111 1110 1111 然後取反得

0000 0000 0000 0000 0000 0000 0001 0000 這個數是多少呢?結果就是-16。

大家多練習就熟練了,歡迎互相交流溝通。!!