天天看點

位運算按位與(&)按位或 (|)按位異或(^)按位取反(~)左移(<<)右移(>>)無符号右移(>>>)

位運算在實際開發中的應用範圍不如算數運算,但是也是我們應該掌握的必備技能,今天就為大家簡單介紹一下位運算的運算過程。

程式中的所有數在計算機記憶體中都是以二進制的形式儲存的。位運算說穿了,就是直接對整數在記憶體中的二進制位進行操作。位運算的效率要高于算術運算。

位運算有以下幾種方式:

按位與(&)

按位或 (|)

按位異或(^)

按位取反(~)

左移(<<)

帶符号右移(>>)

無符号右移(>>>)

按位與(&)就是将資料的每一位進行與運算,與運算的原則為:同真則為真,其它全為假(1為真,0為假)。

下面通過一個例子來看一下與運算的運算過程:

計算:1 & 2 = ?

首先我們将其轉換為二進制,分别為:1和10,右側對齊,左側空位補0,按位進行與運算。

運算結果為:00,轉換成十進制為:0,即: 1 & 2 = 0

按位或 (|)就是将資料的每一位進行或運算,或運算的原則為:同假則為假,其它全為真(1為真,0為假)。

下面通過一個例子來看一下或運算的運算過程:

計算:1 | 2 = ?

首先我們将其轉換為二進制,分别為:1和10,右側對齊,左側空位補0,按位進行或運算。

運算結果為:11,轉換成十進制為:3,即: 1 | 2 = 3

按位異或(^)就是将資料的每一位進行異或運算,異或運算的原則為:一真一假則為真,其它全為假(1為真,0為假)。

下面通過一個例子來看一下異或運算的運算過程:

計算:1 ^ 2 = ?

首先我們将其轉換為二進制,分别為:1和10,右側對齊,左側空位補0,按位進行異或運算。

運算結果為:11,轉換成十進制為:3,即: 1 ^ 2 = 3

在開始按位取反之前,我們需要先了解如下知識:

一個數在計算機中的二進制表示形式,叫做這個數的機器數。機器數是帶符号的,在計算機用一個數的最高位存放符号,正數為0,負數為1。

比如,十進制中的數 +3,計算機字長為8位,轉換成二進制就是00000011。如果是 -3 ,就是 10000011。

那麼,這裡的 00000011和10000011就是機器數。

因為第一位是符号位,是以機器數的形式值就不等于真正的數值。例如上面的有符号數 10000011,其最高位1代表負,其真正數值是 -3而不是形式值131(10000011轉換成十進制等于131)。是以,為差別起見,将帶符号位的機器數對應的真正數值稱為機器數的真值。

例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

原碼, 反碼, 補碼是機器存儲一個具體數字的編碼方式.

原碼就是符号位加上真值的絕對值,即用第一位表示符号,其餘位表示值。 比如如果是8位二進制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位. 因為第一位是符号位, 是以8位二進制數的取值範圍就是:

[1111 1111 , 0111 1111] => [-127 , 127]

原碼是人腦最容易了解和計算的表示方式。

反碼的表示方法是:正數的反碼是其本身,負數的反碼是在其原碼的基礎上, 符号位不變,其餘各個位取反。

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可見如果一個反碼表示的是負數, 人腦無法直覺的看出來它的數值. 通常要将其轉換成原碼再計算.

補碼的表示方法是:正數的補碼就是其本身,負數的補碼是在其原碼的基礎上, 符号位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]補

[-1] = [10000001]原 = [11111110]反 = [11111111]補

對于負數, 補碼表示方式也是人腦無法直覺看出其數值的. 通常也需要轉換成原碼在計算其數值。在計算機系統中,數值的存儲方式為補碼。

回過頭來,我們再看按位取反(~)的操作,按位取反(~)就是将資料的每一位進行取反運算,按位取反運算的原則為:真為假,假為真(1為真,0為假)。

下面通過一個例子來看一下取反運算的運算過程:

計算:~2 = ?,以8位為例。

首先我們将其轉換為二進制,為:0000 0010,按位進行取反運算。

運算結果為:[1111 1101]補,轉換成十進制為:-3,即: ~2 = -3

左移(<<)就是将資料的每一位進行左移,超出舍棄,空位補0。相當于原資料乘以2。

下面通過一個例子來看一下左移運算的運算過程:

計算:1 << 3 = ?,以8位為例。

首先我們将其轉換為二進制,為:0000 0001,按位進行左移。

運算結果為:0000 1000,轉換成十進制為:8,即: 1 << 3 = 8

帶符号右移(>>)就是将資料的每一位進行右移,超出舍棄,空位補0。相當于原資料除以2。

計算:1 >> 3 = ?,以8位為例。

首先我們将其轉換為二進制,為:0000 0001,按位進行右移。

運算結果為:0000 0000,轉換成十進制為:0,即: 1 >> 3 = 0

無符号右移(>>>)就是将資料的每一位進行右移,超出舍棄,空位補0

計算:1 >>> 3 = ?,以8位為例。

運算結果為:0000 0000,轉換成十進制為:0,即: 1 >>> 3 = 0

無符号右移忽略符号位,空位都以0補齊。