位運算的整理

  • 2020 年 1 月 21 日
  • 筆記

在計算機的世界,都是0和1 ,利用這個0和1組成了計算機的基礎,數字是如何在計算機中表示的?二進制到底是什麼?

數字怎麼表示

在剛開始學編程的時候,有幾種常見的數據基礎的數據類型佔用幾個位元組,如int 佔16個位元組(不同的語言體系不同,這裡以C語言為例)。

一個位元組可以表示兩個數字0和1 ,佔16個位元組就可以用2^16個數字。

為了能夠表示負數,單獨保留一個位元組作為符號位, 所以int的整型的範圍是從-32768到32767 .

二進制的換算

十進制的數字是逢十進一,二進制很簡單是逢二進一,比如十進制:3+9=12. 在二進制中:1+1=10.

計算二進制的方法與十進制也相同,比如在十進制中想取個十百的數字,可以分別除10的倍數。

比如取456的各位的數:    456/10=45餘6 ,    45/10=4 餘5    4/10= 0餘4    最終倒序返回時456

換成二進制的方法與十進制相同,唯一的區別是負數的表示方法不同。

比如獲得13的二進制數據:    13/2=6餘1    6/2=3餘0    3/2=1餘1    1/2 餘1    所以13 就是倒序 1101      

負數的表示方法,取反碼,然後加1

13的原碼 1101,對應的反碼是:0010,然後加1 ,0011(完整的數據:‭1111 1111 1111 1111 1111 1111 1111 0011‬)

常用的二進制的使用

二進制的運算效率高於其他計算方法,在日常的代碼中,如果理解沒有障礙的話,個人推薦優先使用位運算。

  1. 奇數和偶數的判斷 a&1 = 0 偶數 a&1 = 1 奇數
  2. 取模運算 a % (2^n) 等價於 a & (2^n – 1) a%16 ==> a&15
  3. 求絕對值 int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y }
  4. 乘以2的次冪
      10>>1=20          10>>2=40          10>>3=80