1, 二進位制
資料在記憶體中是用二進位制儲存的,二進位制是指由0,1兩個元素組成。
其常見的編碼方式有三種:原碼,反碼,補碼
2 ,位
記憶體中最小儲存單元是位,也稱為bit。常常用8個bit儲存乙個字元,即1byte=8bit。
3 ,位操作
是指cpu對記憶體中的二進位制數進行操作。
包括&(與)、|(或)、^(異或)、~(非)、<<(按位左移)、>>(按位右移)六個操作符。
3.1 雙目運算子
是指參與運算的有兩個數。下面括號內分別表示兩個數。
&:if (1,1)?1:0
|:if (1,0) or (0,1) ?1:0
^:if (0,0) or (1,1)?0:1
<<:向左按位進n位,低位補0。
>>:向右按位進n位,低位捨棄。
3.2 單目運算子
是指參與運算的數的本身,即乙個數。
~:if 1?0:1
4, 原碼
指真實的二進位制編碼。
當數是有符號的整數,最高位用來表示正負,1表示負,0表示正,其餘位表示數值的大小。
8位原碼
二進位制 有符號 無符號
00000000 +0 0
00000001 1 1
... ... ...
01111111 127 127
10000000 −0 128
10000001 −1 129
... ... ...
11111111 −127 255
即十進位制5=二進位制0000 0101,-5=1000 0101。
乙個字元所佔的空間是00000000~11111111.
兩個正數相加,即逢2進1.
兩個負數的加法就很簡單了,把結果保留符號位,然後按照正數加法運算即可。
由於cpu中沒有減法器電路,原碼就沒辦法執行減法運算,只能由乙個正數加乙個負數,顯示是計算出來的結果是錯誤的。
比如:5+(-)5=1000 1010=-10(錯誤)
注意到此時有符號數:~(+0)=-127,~1=-126...~127=-0
所以引出反碼。
5, 反碼
反碼是指對有符號數逐位取反,保留符號位;無符號數反碼與原碼相同。
即:反碼=~原碼|1000 0000
8位反碼
二進位制值 反碼表示 無符號數表示
00000000 +0 0
00000001 1 1
... ... ...
01111101 125 125
01111110 126 126
01111111 127 127
10000000 −127 128
10000001 −126 129
10000010 −125 130
... ... ...
11111110 −1 254
11111111 −0 255
如上,注意到實際上是把原碼表中的負數部分上下對調。即-127調到-0的位置,如此類推。
如何調換位置呢?想一想鍊錶,原理類似,只要把除符號位以外的元素進1位即可。
那麼反碼+反碼的結果就是表中所示,如果要對映到原碼表,進一位即可。
所以減法的計算公式:結果+0000 0001(十進位制1)
下面來計算減法:
那麼(-1)+2=1111 1110
+ 0000 0010
+ 0000 0001
= 0000 0001
6,補碼
補碼是指對有符號數逐位取反,保留符號位,然後再加1;無符號數反碼與原碼相同。
回頭再看看反碼的減法,需要進行三步操作,即建立反碼表、加法、對映到原碼表(結果加1)。而且表中還存在兩個0,浪費了寶貴的記憶體空間。
為了解決進製加1,和減少記憶體空間的浪費,所以提出了補碼。
補碼是反碼表加1,即補碼=~原碼|1000 0000+0000 0001
8位補碼
二進位制值 補碼表示 無符號數表示
00000000 0 0
00000001 1 1
... ... ...
01111110 126 126
01111111 127 1275
10000000 −128 128
10000001 −127 129
10000010 −126 130
... ... ...
11111110 −2 254
11111111 −1 255
下面來計算減法:
那麼(-1)+2=1111 1111
+ 0000 0010
= 0000 0001
記憶體中的數是用補碼表儲存的。
7,常用的位操作技巧
7.1 判斷乙個正整數是奇數還是偶數
很顯然在二進位制中只要判斷最後一位是否是0還是1,0即偶數,1為奇數。
即:a&1
實際上我們可以看到&起到乙個只對自己關心的位置操作的作用。有的地方叫著掩碼也正是這個意思。
如果只是想操作某乙個數的第2,3位,可以用a&0000 0110
7.2 交換數不用臨時變數
x^=y;
y^=x;
x^=y;
1.2.
3.4.
5.
二進位制位運算子
二進位制位運算子用於直接對二進位制位進行計算,一共7個。i i 0 上面這行 的意思就是將i 不管是整數或小數 轉為32位整數。利用這一特性,可以寫乙個函式,將任意數值轉為32位整數。function toint32 x toint32 1.001 1 toint32 1.999 1 toint32...
js 二進位制位運算子
ecmascript 整數有兩種型別,即有符號整數 允許用正數和負數 和無符號整數 只允許用正數 在 ecmascript 中,所有整數字面量預設都是有符號整數,這意味著什麼呢?有符號整數使用 31 位表示整數的數值,用第 32 位表示整數的符號,0 表示正數,1 表示負數。數值範圍從 214748...
二進位制位運算
與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...