C語言基本運算

位運算是指按二進(jìn)制進(jìn)行的運算奉呛。在系統(tǒng)軟件中藏杖,常常需要處理二進(jìn)制位的問題懂盐。C語言提供了6個位操作運算符。這些運算符只能用于整型操作數(shù)跛蛋,即只能用于帶符號或無符號的char,short,int與long類型熬的。

C語言提供的位運算符列表:

運算符含義描述

&按位與如果兩個相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果值為1赊级,否則為0

|按位或兩個相應(yīng)的二進(jìn)制位中只要有一個為1押框,該位的結(jié)果值為1

^按位異或若參加運算的兩個二進(jìn)制位值相同則為0,否則為1

~取反~是一元運算符理逊,用來對一個二進(jìn)制數(shù)按位取反橡伞,即將0變1,將1變0

<<左移用來將一個數(shù)的各二進(jìn)制位全部左移N位晋被,右補0

>>右移將一個數(shù)的各二進(jìn)制位右移N位兑徘,移到右端的低位被舍棄,對于無符號數(shù)羡洛,高位補0

1挂脑、“按位與”運算符(&)

按位與是指:參加運算的兩個數(shù)據(jù),按二進(jìn)制位進(jìn)行“與”運算欲侮。如果兩個相應(yīng)的二進(jìn)制位都為1崭闲,

則該位的結(jié)果值為1;否則為0威蕉。這里的1可以理解為邏輯中的true,0可以理解為邏輯中的false刁俭。按位與其

實與邏輯上“與”的運算規(guī)則一致。邏輯上的“與”韧涨,要求運算數(shù)全真牍戚,結(jié)果才為真。若虑粥,

A=true,B=true,則A∩B=true例如:3&53的二進(jìn)制編碼是11(2)翘魄。(為了區(qū)分十進(jìn)制和其他進(jìn)制,本文規(guī)

定舀奶,凡是非十進(jìn)制的數(shù)據(jù)均在數(shù)據(jù)后面加上括號,括號中注明其進(jìn)制斋射,二進(jìn)制則標(biāo)記為2)內(nèi)存儲存數(shù)據(jù)

的基本單位是字節(jié)(Byte)育勺,一個字節(jié)由8個位(bit)所組成。位是用以描述電腦數(shù)據(jù)量的最小單位罗岖。二

進(jìn)制系統(tǒng)中涧至,每個0或1就是一個位。將11(2)補足成一個字節(jié)桑包,則是00000011(2)南蓬。5的二進(jìn)制編碼是

101(2),將其補足成一個字節(jié),則是00000101(2)

按位與運算:

00000011(2)

&00000101(2)

00000001(2)

由此可知3&5=1

c語言代碼:

#include

main()

{

inta=3;

intb=5;

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

}

按位與的用途:

(1)清零

若想對一個存儲單元清零赘方,即使其全部二進(jìn)制位為0烧颖,只要找一個二進(jìn)制數(shù),其中各個位符合一下條件:

原來的數(shù)中為1的位窄陡,新數(shù)中相應(yīng)位為0炕淮。然后使二者進(jìn)行&運算,即可達(dá)到清零目的跳夭。

例:原數(shù)為43涂圆,即00101011(2),另找一個數(shù)币叹,設(shè)它為148润歉,即10010100(2),將兩者按位與運算:

00101011(2)

&10010100(2)

00000000(2)

c語言源代碼:

#include

main()

{

inta=43;

intb=148;

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

}

(2)取一個數(shù)中某些指定位

若有一個整數(shù)a(2byte),想要取其中的低字節(jié)颈抚,只需要將a與8個1按位與即可踩衩。

a0010110010101100

b0000000011111111

c0000000010101100

(3)保留指定位:

與一個數(shù)進(jìn)行“按位與”運算,此數(shù)在該位取1.

例如:有一數(shù)84邪意,即01010100(2)九妈,想把其中從左邊算起的第3,4雾鬼,5萌朱,7,8位保留下來策菜,運算如下:

01010100(2)

&00111011(2)

00010000(2)

即:a=84,b=59

c=a&b=16

c語言源代碼:

#include

main()

{

inta=84;

intb=59;

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

}

2晶疼、“按位或”運算符(|)

兩個相應(yīng)的二進(jìn)制位中只要有一個為1,該位的結(jié)果值為1又憨。借用邏輯學(xué)中或運算的話來說就是翠霍,一真為真

例如:60(8)|17(8),將八進(jìn)制60與八進(jìn)制17進(jìn)行按位或運算蠢莺。

00110000

|00001111

00111111

c語言源代碼:

#include

main()

{

inta=060;

intb=017;

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

}

應(yīng)用:按位或運算常用來對一個數(shù)據(jù)的某些位定值為1寒匙。例如:如果想使一個數(shù)a的低4位改為1,則只需要

將a與17(8)進(jìn)行按位或運算即可躏将。

3锄弱、“異或”運算符(^)

他的規(guī)則是:若參加運算的兩個二進(jìn)制位值相同則為0,否則為1

即0∧0=0祸憋,0∧1=1会宪,1∧0=1,1∧1=0

例:00111001

∧00101010

00010011

c語言源代碼:

#include

main()

{

inta=071;

intb=052;

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

}

應(yīng)用:

(1)使特定位翻轉(zhuǎn)

設(shè)有數(shù)01111010(2)蚯窥,想使其低4位翻轉(zhuǎn)掸鹅,即1變0塞帐,0變1.可以將其與00001111(2)進(jìn)行“異或”運算,

即:

01111010

^00001111

01110101

運算結(jié)果的低4位正好是原數(shù)低4位的翻轉(zhuǎn)巍沙】眩可見,要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行∧運算的該幾位置為1

即可赎瞎。

(2)與0相“異或”牌里,保留原值

例如:012^00=012

00001010

^00000000

00001010

因為原數(shù)中的1與0進(jìn)行異或運算得1,0^0得0务甥,故保留原數(shù)牡辽。

(3)交換兩個值,不用臨時變量

例如:a=3敞临,即11(2)态辛;b=4,即100(2)挺尿。

想將a和b的值互換奏黑,可以用以下賦值語句實現(xiàn):

a=a∧b;

b=b∧a;

a=a∧b;

a=011(2)

(∧)b=100(2)

a=111(2)(a∧b的結(jié)果,a已變成7)

(∧)b=100(2)

b=011(2)(b∧a的結(jié)果编矾,b已變成3)

(∧)a=111(2)

a=100(2)(a∧b的結(jié)果熟史,a已變成4)

等效于以下兩步:

①執(zhí)行前兩個賦值語句:“a=a∧b;”和“b=b∧a窄俏;”相當(dāng)于b=b∧(a∧b)蹂匹。

②再執(zhí)行第三個賦值語句:a=a∧b。由于a的值等于(a∧b)凹蜈,b的值等于(b∧a∧b)限寞,

因此,相當(dāng)于a=a∧b∧b∧a∧b仰坦,即a的值等于a∧a∧b∧b∧b履植,等于b。

很神奇吧悄晃!

c語言源代碼:

#include

main()

{

inta=3;

intb=4;

a=a^b;

b=b^a;

a=a^b;

printf("a=%db=%d",a,b);

}

4玫霎、“取反”運算符(~)

他是一元運算符,用于求整數(shù)的二進(jìn)制反碼妈橄,即分別將操作數(shù)各二進(jìn)制位上的1變?yōu)?鼠渺,0變?yōu)?。

例如:~77(8)

源代碼:

#include

main()

{

inta=077;

printf("%d",~a);

}

5眷细、左移運算符(<<)

左移運算符是用來將一個數(shù)的各二進(jìn)制位左移若干位,移動的位數(shù)由右操作數(shù)指定(右操作數(shù)必須是非負(fù)

值)鹃祖,其右邊空出的位用0填補溪椎,高位左移溢出則舍棄該高位。

例如:將a的二進(jìn)制數(shù)左移2位,右邊空出的位補0校读,左邊溢出的位舍棄沼侣。若a=15,即00001111(2),左移2

位得00111100(2)歉秫。

源代碼:

#include

main()

{

inta=15;

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

}

左移1位相當(dāng)于該數(shù)乘以2蛾洛,左移2位相當(dāng)于該數(shù)乘以2*2=4,15<<2=60,即乘了4雁芙。但此結(jié)論只適用于該

數(shù)左移時被溢出舍棄的高位中不包含1的情況轧膘。

假設(shè)以一個字節(jié)(8位)存一個整數(shù),若a為無符號整型變量兔甘,則a=64時谎碍,左移一位時溢出的是0

,而左移2位時洞焙,溢出的高位中包含1蟆淀。

6、右移運算符(>>)

右移運算符是用來將一個數(shù)的各二進(jìn)制位右移若干位澡匪,移動的位數(shù)由右操作數(shù)指定(右操作數(shù)必須是非負(fù)

值)熔任,移到右端的低位被舍棄,對于無符號數(shù)唁情,高位補0疑苔。對于有符號數(shù),某些機(jī)器將對左邊空出的部分

用符號位填補(即“算術(shù)移位”)荠瘪,而另一些機(jī)器則對左邊空出的部分用0填補(即“邏輯移位”)夯巷。注

意:對無符號數(shù),右移時左邊高位移入0;對于有符號的值,如果原來符號位為0(該數(shù)為正),則左邊也是移

入0哀墓。如果符號位原來為1(即負(fù)數(shù)),則左邊移入0還是1,要取決于所用的計算機(jī)系統(tǒng)趁餐。有的系統(tǒng)移入0,有的

系統(tǒng)移入1。移入0的稱為“邏輯移位”,即簡單移位篮绰;移入1的稱為“算術(shù)移位”后雷。

例:a的值是八進(jìn)制數(shù)113755:

a:1001011111101101(用二進(jìn)制形式表示)

a>>1:0100101111110110(邏輯右移時)

a>>1:1100101111110110(算術(shù)右移時)

在有些系統(tǒng)中,a>>1得八進(jìn)制數(shù)045766,而在另一些系統(tǒng)上可能得到的是145766。TurboC和其他一些C

編譯采用的是算術(shù)右移,即對有符號數(shù)右移時,如果符號位原來為1吠各,左面移入高位的是1臀突。

源代碼:

#include

main()

{

inta=0113755;

printf("%d",a>>1);

}

7、位運算賦值運算符

位運算符與賦值運算符可以組成復(fù)合賦值運算符贾漏。

例如:&=,|=,>>=,<<=,∧=

例:a&=b相當(dāng)于a=a&b

a<<=2相當(dāng)于a=a<<2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末候学,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纵散,更是在濱河造成了極大的恐慌腿倚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囤官,死亡現(xiàn)場離奇詭異肃叶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盐碱,你說我怎么就攤上這事』铮” “怎么了瓮顽?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長焰坪。 經(jīng)常有香客問我趣倾,道長,這世上最難降的妖魔是什么某饰? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任儒恋,我火速辦了婚禮,結(jié)果婚禮上黔漂,老公的妹妹穿的比我還像新娘诫尽。我一直安慰自己,他們只是感情好炬守,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布牧嫉。 她就那樣靜靜地躺著,像睡著了一般减途。 火紅的嫁衣襯著肌膚如雪酣藻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天鳍置,我揣著相機(jī)與錄音辽剧,去河邊找鬼。 笑死税产,一個胖子當(dāng)著我的面吹牛怕轿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辟拷,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼撞羽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衫冻?” 一聲冷哼從身側(cè)響起诀紊,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隅俘,沒想到半個月后邻奠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體到推,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年惕澎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颜骤。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡唧喉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忍抽,到底是詐尸還是另有隱情八孝,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布鸠项,位于F島的核電站干跛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祟绊。R本人自食惡果不足惜楼入,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牧抽。 院中可真熱鬧嘉熊,春花似錦、人聲如沸扬舒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讲坎。三九已至孕惜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晨炕,已是汗流浹背衫画。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留府瞄,地道東北人碧磅。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像遵馆,于是被迫代替她去往敵國和親鲸郊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容