位運算的整理
- 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)
常用的二進制的使用
二進制的運算效率高於其他計算方法,在日常的代碼中,如果理解沒有障礙的話,個人推薦優先使用位運算。
- 奇數和偶數的判斷 a&1 = 0 偶數 a&1 = 1 奇數
- 取模運算 a % (2^n) 等價於 a & (2^n – 1) a%16 ==> a&15
- 求絕對值 int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y }
- 乘以2的次冪
10>>1=20 10>>2=40 10>>3=80