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)