官术网_书友最值得收藏!

2.8 位運算符

2.8.1 位運算符和位運算介紹

所謂位運算就是指二進制位的運算。C語言的一大特點就是允許直接對數據的二進制位進行操作,這就是C語言所提供的位運算功能。位運算的功能就是對操作數按其二進制補碼形式逐位進行邏輯運算;位運算的操作對象只能是整型或字符型數據,不能是實型數據。

C語言所提供的位運算符見表2.4。

表2.4 位運算符

位運算符中只有運算符“~”是單目運算符,其他均為雙目運算符,即要求運算符的兩側各有一個操作數,且操作數只能是整型或字符型數據。

(1)按位與運算符(&)

按“位與”的一般格式為:

  操作數1 & 操作數2

運算規則:先將兩個操作數轉換為二進制補碼形式,然后將兩個操作數對應的二進制位進行與運算,運算規則是對應位全1,則該位的運算結果為1,否則為0。即:

1&1=1; 1&0=0; 0&1=0; 0&0=0。

例如:計算3&5。

因此,3&5的值為1。

例如:計算-5&6。

因此,-5&6的值為2。

(2)按位或運算符(|)

按“位或”的一般格式為:

操作數1|操作數2

運算規則:先將兩個操作數轉換為二進制補碼形式,然后將兩個操作數對應的二進制位進行或運算,運算規則是對應位全0,則該位的運算結果為0,否則為1。即:

1|1=1; 1|0=1; 0|1=1; 0|0=0。

例如:計算3|5。

因此,3|5的值為7。

例如:計算-5|6。

因此,-5|6的值為-1。

(3)按位取反運算符(~)

運算規則:運算符“~”是單目運算符,先將操作數轉換為二進制補碼形式,然后各個二進制位都取其反值。即:

~1=0; ~0=1。

例如:計算~26。26的二進制補碼形式為 00011010,計算過程如下:

因此,~26的值為-27(二進制補碼11100101轉換為十進制數就是-27)。

(4)按位異或運算符(^)

運算規則:先將兩個操作數轉換為二進制補碼形式,然后將兩個操作數對應的二進制位進行異或運算,運算規則是對應位值相同,則該位的運算結果為0,否則為1。即:

0^0=0;0^1=1;1^0=1;1^1=0。

例如:計算9^20。

因此,9^20的值為29。

按位“異或”運算可以實現在不使用第三個變量的前提下,“交換”兩個變量的值。

例如:有兩個操作數x和y,假設x=5,y=6 不使用臨時變量,交換x和y的值。計算過程如下:x=x^y ; y=y^x ; x=x^y。

第一步,計算x=x^y。

第二步,計算y=y^x。

(交換后y的值為5)

第三步,計算x=x^y。

(交換后x的值為6)

(5)左移運算符(<<)

將一個操作數的各二進制位全部向左移動指定的位數。左移后,右邊空出來的位置補0,左邊移出的位舍去。其一般格式為:

    操作數1 <<操作數2

其中“操作數1”是被左移的操作數,“操作數2”是左移的位數。

例如:若x=13,計算x=x<<2的值。

x經過左移2位后變為0011 0100,即十進制數52。

從結果可以看出將操作數左移1位,相當于該數乘以2,左移2位相當于該數乘以22,依次類推。上例中,十進制數13左移2位的值為52,即乘了22

注意:以上結論只在沒有1被左移出去或移到最高位的情況下才是正確的。

(6)右移運算符(>>)

右移運算符(>>)的一般格式為:

    操作數1>>操作數2

其中“操作數1”是被右移的操作數,“操作數2”是右移的位數。

將一個操作數的各二進制位全部向右移動指定的位數。右移后右邊移出去的位舍去。左邊的高位填補分兩種情況。

①對無符號數:右移時高位補0。

例如:若x=20,計算x=x>>2的值。

x經過右移2位后變為0000 0101,即十進制數5。

右移一位相當于除以2,右移n位相當于除以2n

②對有符號數:如果符號位為0(即正數),高位補0;如果符號位為1(即負數),則高位補1。這種補1以保持操作數原來的符號的方法稱為“算術右移”,補0的稱為“邏輯右移”。

例如:計算-60>>2的值。

-60以二進制補碼形式表示為11000100,

右移2位后   

1111 0001的十進制數為-15的補碼表示。

因此,-60>>2的值為-15。

【例2.14】  位運算舉例。

#include<stdio.h>

void main()

{ int a=9,b=5;

 printf("%d\n",a&b);

 printf("%d\n",a|b);

 printf("%d\n",a^b);

 printf("%d\n",~a);

 printf("%d\n",a<<2);

 printf("%d\n",a>>2);

}

程序運行結果:

1

13

12

-10

36

2

2.8.2 位運算賦值運算符

位運算賦值運算符是由位運算符和賦值運算符組合而成的復合運算符。位運算賦值運算符的一般格式如下:

  操作數1 位運算賦值運算符 操作數2

在C語言中,可以使用的位運算賦值運算符有5種形式:&=、|=、^=、>>=和<<=。

位運算賦值運算符采用自右向左的結合順序,運算規則是先用操作數1和操作數2進行運算,再將運算結果存入操作數2變量中。例如:

x&=y  等價于 x=x&y

z<<=1  等價于 z=z<<1

C語言采用復合運算符,一是為了簡化程序,使程序簡練;二是使編譯系統生成質量較高的目標代碼,以提高編譯效率。

主站蜘蛛池模板: 十堰市| 盱眙县| 怀化市| 沈丘县| 海门市| 隆子县| 洮南市| 祥云县| 屏东县| 米易县| 华阴市| 晋中市| 泽普县| 山阳县| 田阳县| 潜山县| 曲麻莱县| 锡林郭勒盟| 丰城市| 连云港市| 修武县| 郑州市| 平邑县| 玉环县| 泗阳县| 平潭县| 孟村| 东城区| 旬阳县| 中阳县| 砚山县| 颍上县| 日喀则市| 襄樊市| 拉萨市| 鄂尔多斯市| 贵德县| 连城县| 葵青区| 庄河市| 荥经县|