位運算及其應用詳解

2021-07-10 17:22:41 字數 4989 閱讀 6554

位運算子

位運算是以二進位制位為單位進行的運算,其運算元和運算結果都是整型值。 //todo 字元型(char)?

位運算子共有7個,分別是:位與(&)、位或(|)、位非(~)、位異或(^)、右移(>>)、左移(<<)、0填充的右移(>>>)。

一.邏輯運算子

1.& 位與運算

1) 運算規則

位與運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯與運算。例如:int型常量4和7進行位與運算的運算過程如下:

4 =0000 0000 0000 0100 &

7 =0000 0000 0000 0111

=  0000 0000 0000 0100

對於負數,按其補碼進行運算。例如:int型常量-4和7進行位與運算的運算過程如下:

-4=1111 1111 1111 1100 &

7 =0000 0000 0000 0111

= 0000 0000 0000 0100

2) 典型應用

(1) 清零

清零:快速對某一段資料單元的資料清零,即將其全部的二進位制位為0。例如整型數a=321對其全部資料清零的操作為a=a&0x0。321=0000 0001 0100 0001 &0=0000 0000 0000 0000

= 0000 0000 0000 0000

(2) 獲取乙個資料的指定位

獲取乙個資料的指定位。例如獲得整型數a=的低八位資料的操作為a=a&0xff。321=

0000 0001 0100 0001 & 0xff =0000 0000 1111 11111

= 0000 0000 0100 0001

獲得整型數a=的高八位資料的操作為a=a&0xff00。==a&0xff00==

321=0000 0001 0100 0001 & 0xff00=1111 1111 0000 0000

= 0000 0001 0000 0000

(3)保留資料區的特定位

保留資料區的特定位。例如獲得整型數a=的第7-8位(從0開始)位的資料操作為:110000000

321=0000 0001 0100 0001 & 384=0000 0001 1000 0000

=0000 0001 0000 0000

2. | 位或運算

1) 運算規則

位或運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯或運算。例如:int型常量5和7進行位或運算的表示式為5|7,結果如下:

5= 0000 0000 0000 0101 | 

7= 0000 0000 0000 0111

=   0000 0000 0000 0111

2) 主要用途

(1) 設定乙個資料的指定位。例如整型數a=321,將其低八位資料置為1的操作為a=a|0xff。321= 0000 0001 0100 0001 | 0000 0000 1111 1111=0000 0000 1111 1111

邏輯運算子||與位或運算子|的區別

條件「或」運算子(||) 執行bool 運算元的邏輯「或」運算,但僅在必要時才計算第二個運算元。x || y , x | y 不同的是,如果x 為true,則不計算y(因為不論y 為何值,「或」操作的結果都為true)。這被稱作為「短路」計算。

3. ^ 位異或

1) 運算規則

位異或運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯異或運算。只有當對應位的二進位制數互斥的時候,對應位的結果才為真。例如:int型常量5和7進行位異或運算的表示式為5^7,結果如下:

5= 0000 0000 0000 0101  ^

7= 0000 0000 0000 0111

= 0000 0000 0000 0010

2) 典型應用

(1)定位翻轉

定位翻**設定乙個資料的指定位,將1換為0,0換為1。例如整型數a=321,,將其低八位資料進行翻位的操作為a=a^0xff;

(2)數值交換

數值交換。例如a=3,b=4。在例11-1中,無須引入第三個變數,利用位運算即可實現資料交換。以下的操作可以實現a,b兩個資料的交換:

a=a^b;

b=b^a;

a=a^b;

4.~ 位非

位非運算的實質是將參與運算的資料,按對應的二進位制數逐位進行邏輯非運算。

二.位移運算子

1.位左移

左移運算的實質是將對應的資料的二進位制值逐位左移若干位,並在空出的位置上填0,最高位溢位並捨棄。例如int a,b;

a=5;

b=a<<2;

則b=20,分析過程如下:

(a)10=(5)10=(0000 0000 0000 0101)2

b=a<<2;

b=(0000 0000 0001 0100)2=(20)10

從上例可以看出位運算可以實現二倍乘運算。由於位移操作的運算速度比乘法的運算速度高很多。因此在處理資料的乘法運算的時,採用位移運算可以獲得較快的速度。

提示將所有對2的乘法運算轉換為位移運算,可提高程式的執行效率

2.位右移

位右移運算的實質是將對應的資料的二進位制值逐位右移若干位,並捨棄出界的數字。如果當前的數為無符號數,高位補零。例如:

int (a)10=(5)10=(0000 0000 0000 0101)2

b=a>>2;

b=(0000 0000 0000 0001)2=(1)10

// todo  10/4=1  ?

如果當前的資料為有符號數,在進行右移的時候,根據符號位決定左邊補0還是補1。如果符號位為0,則左邊補0;但是如果符號位為1,則根據不同的計算機系統,可能有不同的處理方式。可以看出位右移運算,可以實現對除數為2的整除運算。

提示 將所有對2的整除運算轉換為位移運算,可提高程式的執行效率

舉例說明:

(1)有如下程式段:

int x = 64; //x等於二進位制數的01000000

int y = 70; //y等於二進位制數的01000110

int z = x&y //z等於二進位制數的01000000

即運算結果為z等於二進位制數01000000。位或、位非、位異或的運算方法類同。

(2)右移是將乙個二進位制數按指定移動的位數向右移位,移掉的被丟棄,左邊移進的部分或者補0(當該數為正時),或者補1(當該數為負時)。這是因為整數在機器內部採用補碼表示法,

正數的符號位為0,負數的符號位為1。例如,對於如下程式段:

int x = 70; //x等於二進位制數的01000110

int y = 2;

int z = x>>y //z等於二進位制數的00010001

即運算結果為z等於二進位制數 00010001,即z等於

十進位制數

17。對於如下程式段:

int x = -70; //x等於二進位制數的11000110

int y = 2;

int z = x>>y //z等於二進位制數的11101110//todo 為啥?

即運算結果為z等於二進位制數 11101110,即z等於

十進位制數

-18。要透徹理解右移和左移操作,讀者需要掌握整數機器數的補碼表示法。

(3)0填充的右移(>>>)

不論被移動數是正數還是負數,左邊移進的部分一律補0。

3.復合的位運算子

在c語言中還提供復合的位運算子,如下:

&=、!=、>>=、<<=和^=

例如:a&=0x11等價於 a= a&0x11,其他運算子以此類推。

不同型別的整數資料在進行混合型別的位運算時,按右端對齊原則進行處理,按資料長度大的資料進行處理,將資料長度小的資料左端補0或1。例如char a與int b進行位運算的時候,按int 進行處理,char a轉化為整型資料,並在左端補0。

補位原則如下:

1)對於有符號資料:如果a為正整數,則左端補0,如果a 為負數,則左端補1。

2)對於無符號資料:在左端補0。

4.例子

例11-2 獲得乙個無符號資料從第p位開始的n位二進位制資料。假設資料右端對齊,第0位二進位制數在資料的最右端,獲得的結果要求右對齊。

#include

/*getbits:獲得從第p位開始的n位二進位制數 */

unsigned int getbits(unsigned int x, unsigned int p, unsigned n)

提示 在某一平台進行程式開發時,首先要求了解此系統的基本資料型別的有效範圍, 對涉及的位運算進行評估,特別是要對邊界資料進行檢測,確保計算正確。

位運算及其應用詳解

一 邏輯運算子 1.位與運算 1 運算規則 位與運算的實質是將參與運算的兩個資料,按對應的二進位制數逐位進行邏輯與運算。例如 int型常量4和7進行位與運算的運算過程如下 4 0000 0000 0000 0100 7 0000 0000 0000 0111 0000 0000 0000 0100 ...

位運算及其應用

按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0。按位或 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1。按位異或 若參加運算的兩個二進位制位值相同則為0,否則為1。取反 是一元運算子,用來對乙個二進位制數按位取反,即將0變1,將1變0。左移 用來將乙個數的各二進位制位全...

Python 位運算及其應用

1.機器數 真值,原碼 反碼 補碼 機器數 乙個數在計算機中的二進位制表示形式,機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1 真值 因為第一位是符號位,所以機器數的形式值就不等於真正的數值,將帶符號位的機器數對應的真正數值稱為機器數的真值 為什麼要設定原碼 反碼 補碼 方便...