位運(yùn)算

Ps:位運(yùn)算符是指進(jìn)行二進(jìn)制的運(yùn)算。C語言中提供的位運(yùn)算包括,與(&)、或(|)、異或(^)、取反(~)、移動(dòng)(“<<”或“>>”)這些邏輯。

[if !supportLists]1、[endif]位于運(yùn)算的的邏輯:

與運(yùn)算符(&):

當(dāng)兩個(gè)位進(jìn)行相與是,只有兩者都為“1”時(shí)結(jié)果才為“1”,其他都為“0”。&和&&相似兩邊都要滿足“1”時(shí)才有結(jié)果,其他的都為“0”。

例如:0x8a & 0x45

???????? 0x8a = 1000 1010

&

0x45 = 0100 0101

結(jié)果為 0000 0000,轉(zhuǎn)化為16進(jìn)制等于 0x00。

實(shí)例:???? 0x5d & 0x7c = 0x5c

0x79 & 0xa3 = 0x21

0xe2 & 0x83 = 0x82。


如果遇到八進(jìn)制,那么將八進(jìn)制轉(zhuǎn)化為二進(jìn)制進(jìn)行計(jì)算,差的位數(shù)就往最前面補(bǔ)零。

???????? 例如:0xe3 &025?

?????????????????? 0xe3= 1110 0011

?????????????????? ?025 = 0001 0101

?????????????????? 結(jié)果就為0000 0001,轉(zhuǎn)化為十六進(jìn)制等于0x01。



或運(yùn)算符(|)

當(dāng)兩位進(jìn)行相或時(shí),兩者中只要有一方為“1”,結(jié)果就為“1”,其他都為“0”,注意:位或是一個(gè)|,兩個(gè)||是邏輯或。例:1|0 = 1? 1|0 = 1? 0|0 =0?0|1 = 1。

???????? 例如:0x2b |0xf7

?????????????????? 0x2b= 0010 1011

?????????????????? 0xf7= 1111 0111

?????????????????? 結(jié)果為1111 1111,轉(zhuǎn)化為十六進(jìn)制等于0xff

如果與(&)和或(|)同時(shí)運(yùn)用,按照運(yùn)算符優(yōu)先級計(jì)算,有括號的先算括號里面的。

???????? 例如:0xd3&(0xad | 057) = 0x83

?????????????????? ? 0x43 |(0x62 & 0x7d) = 0x63


異或運(yùn)算符(^)

當(dāng)兩個(gè)位進(jìn)行異或時(shí),兩者相同皆為“0”,否則結(jié)果就為“1”。

???????? 例如:0x6a ^0xf4

?????????????????? ?0x6a = 0110 1010

?????????????????? ?0xf4 = 1111 0100

?????????????????? 結(jié)果為1001 1110,轉(zhuǎn)化為十六進(jìn)制等于0x9e。

注意:如下面列題所示,那么要先遵守(運(yùn)算符優(yōu)先級)。

???????? 例1:0x68 & (0x3c^ 0x45)= 0x68

例2:0xe3 |(0x37^0xa6) = 0xf3




按位取反運(yùn)算(~)

取反運(yùn)算符(~),按二進(jìn)制數(shù)計(jì)算,逐個(gè)取反(“0”變“1”,“1”變“0”)。

注:邏輯取反是真(在c語言中只要不是“0”的任何數(shù)都為真)變?yōu)榧伲ㄖ挥小?”表示假)、假就變?yōu)檎妗?/p>

例如:

~0x9d --> 1001 1101?取反得 0110 0010轉(zhuǎn)化為十六進(jìn)制為0x62

~0xa4 --> 1010 0100?取反得 0101 1011轉(zhuǎn)為十六進(jìn)制為0x5b

???????? ~0xc3 --> 1100 0011?取反得0011 1100轉(zhuǎn)為十六進(jìn)制為0x3c。



左移(<<)

左移運(yùn)算符(<<),用來把各個(gè)二進(jìn)制數(shù)全部向左移動(dòng)N個(gè)位,注意(高位丟棄,低位補(bǔ)“0”)。

?????????????????? 例如:0x23?進(jìn)行左移2位

?????????????????? 拆解為二進(jìn)制:00000000 0010 0011

?????????????????? 高位丟棄:(00)0000 00100011

?????????????????? 低位補(bǔ)零:00000000 1000 1100

?????????????????? 表達(dá)式為:(0x23<<2)

?????????????????????????????????????????????????????????????????????????? 注:高位丟棄多少位,低位補(bǔ)上多少零。

右移(>>)

右移運(yùn)算符(>>),用來把各個(gè)二進(jìn)制數(shù)全部右移N個(gè)單位,低位丟棄,高位補(bǔ)“0”或是“1”。

?????????????????? 例如:0x7e 進(jìn)行右移2位

?????????????????? 拆解為二進(jìn)制:00000000 0111 1110

?????????????????? 高位補(bǔ)零:(00)0000 0000 01111110

?????????????????? 低位丟棄:???? 0000 0000 0111 1100(10 丟棄)

?????????????????? 表達(dá)式為:0x7e<<2

??????????????????????????????????????????????????????? 注:低位丟棄,高位補(bǔ)零。如果最高位是“1”,那么就補(bǔ)“1”。


重點(diǎn):

特定位清零時(shí),用位與(&)計(jì)算。

例1:把0x7d的第2位和第3位進(jìn)行清零,求表達(dá)式。注(第幾位都是以下標(biāo)的形式計(jì)算),步驟如下:

?????????????????? ?1、 0x7d拆分為二進(jìn)制:0111 1100

?????????????????? ?2、????提出清零的數(shù):0000 1100

?????????????????? ?3、????????????取反:1111 0011

?????????????????? ?1和3進(jìn)行位與(&)得到結(jié)果:0111 0000

?????????????????? ?那么表達(dá)式就為:0x7d

&~(0x3<<2)。????????????????



特定位置“1”時(shí),用位或(|)計(jì)算。

???????? ???????? 口訣:清零取反要用與(&),某位置“1”要用或(|),

?????????????????? ??????? ??若要取反和交換,輕輕松松用異或(^)。

??????????????????????????? 例1:把0xc7的第3—5位置1,求表達(dá)式。

???????????????????????????????????? 1、0xc7拆分為二進(jìn)制數(shù):1100 0111

???????????????????????????????????? 2、??提出置“1”的數(shù):0011 1000

???????????????????????????????????? 1和2進(jìn)行位或(|)得到結(jié)果:1111 1111

???????????????????????????????????? 那么表達(dá)式就為:0xc7 | (0x7<<3)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容