二進位制 位操作運算子

2022-07-16 12:45:16 字數 3120 閱讀 6554

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 按...