C Bitovni operaterji: AND, OR, XOR, Operacije dopolnjevanja in premika

V tej vadnici boste s primeri spoznali vseh 6 bitnih operatorjev v programiranju C.

V aritmetično-logični enoti (ki je znotraj CPE-ja) se matematične operacije, kot so: seštevanje, odštevanje, množenje in deljenje, izvajajo na bitni ravni. Za izvajanje operacij na bitni ravni pri programiranju C se uporabljajo bitni operatorji.

Operaterji Pomen operatorjev
& Bitovno AND
| Bitovno ALI
^ Bitno XOR
~ Bitno dopolnilo
<< Prestavite levo
>> Prestavite desno

Bitni AND operator &

Izhod bitnega AND je 1, če je ustrezen bit dveh operandov 1. Če je kateri koli bit operanda 0, se rezultat ustreznega bita oceni na 0.

Predpostavimo, da deluje po bitnih korakih AND dveh celih števil 12 in 25.

 12 = 00001100 (v binarnem) 25 = 00011001 (v binarnem) Bit delovanje 12 in 25 00001100 & 00011001 ________ 00001000 = 8 (v decimalnem)

Primer št. 1: Bitovno AND

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a&b); return 0; ) 

Izhod

 Izhod = 8

Bitno ALI operator |

Izhod bitnega OR je 1, če je vsaj en ustrezen bit dveh operandov 1. Pri programiranju C je bitni operater OR označen z |.

12 = 00001100 (v binarni obliki) 25 = 00011001 (v binarni obliki) Bitno ALI delovanje 12 in 25 00001100 | 00011001 ________ 00011101 = 29 (v decimalnih številkah)

2. primer: Bitno ALI

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a|b); return 0; ) 

Izhod

 Izhod = 29

Bitno XOR (izključno ALI) operator ^

Rezultat bitnega operatorja XOR je 1, če sta ustrezna bita dveh operandov nasprotna. Označuje se s ^.

 12 = 00001100 (v binarnem) 25 = 00011001 (v binarnem) Bitno XOR Delovanje 12 in 25 00001100 00011001 ________ 00010101 = 21 (v decimalnem)

3. primer: Bitni XOR

 #include int main() ( int a = 12, b = 25; printf("Output = %d", a^b); return 0; )

Izhod

 Izhod = 21

Operator bitnega komplementa ~

Bit-ov komplimentni operater je unarni operater (deluje samo na enem operandu). Spremeni se 1 na 0 in 0 na 1. Označuje se z ~.

 35 = 00100011 (v binarni različici) Bitno dopolnilo Operacija 35 ~ 00100011 ________ 11011100 = 220 (v decimalni številki) 

Zavijte v bitni operator komplementa v programiranju C.

Bitno dopolnilo 35 (~ 35) je -36 namesto 220, a zakaj?

Za katero koli celo število n bo bitno dopolnilo n -(n+1). Da bi to razumeli, bi morali imeti znanje o dopolnilih 2.

Dopolnilo 2

Dvoje dopolnilo je operacija nad binarnimi števili. Dopolnilo številke 2 je enako dopolnilu tega števila plus 1. Na primer:

 Dopolnilo decimalnih binarnih 2 0 00000000 - (11111111 + 1) = -00000000 = -0 (decimalno) 1 00000001 - (11111110 + 1) = -11111111 = -256 (decimalno) 12 00001100 - (11110011 + 1) = -11110100 = -244 (decimalno) 220 11011100 - (00100011 + 1) = -00100100 = -36 (decimalno) Opomba: Prelivanje se med računanjem komplementa 2 prezre. 

Bitno dopolnilo 35 je 220 (v decimalnih številkah). Komplementa 2 z 220 je -36. Izhod je torej -36 namesto 220.

Bitno dopolnilo poljubnega števila N je - (N + 1). Takole:

 bitni komplement N = ~ N (predstavljen v obliki komplementa 2) 2'komplement ~ N = - (~ (~ N) +1) = - (N + 1) 

Primer # 4: Bitno dopolnilo

 #include int main() ( printf("Output = %d",~35); printf("Output = %d",~-12); return 0; ) 

Izhod

 Izhod = -36 Izhod = 11

Operaterji premikov v programiranju C.

V programiranju C sta dva operaterja izmene:

  • Operater desne izmene
  • Levi menjalnik.

Desni menjalnik

Operator desnega premika premakne vse bitove v desno za določeno število določenih bitov. Označuje se z >>.

 212 = 11010100 (v binarnem) 212 >> 2 = 00110101 (v binarnem) (desni premik za dva bita) 212 >> 7 = 00000001 (v binarnem) 212 >> 8 = 00000000 212 >> 0 = 11010100 (brez premika) 

Levi menjalnik

Operator levega premika premakne vse bite proti levi za določeno število določenih bitov. Položaji bitov, ki jih je zapustil operater leve izmene, so zapolnjeni z 0. Simbol levega operaterja premika je <<.

 212 = 11010100 (v binarnem) 212 << 1 = 110101000 (v binarnem) (levi premik za en bit) 212 << 0 = 11010100 (premik za 0) 212 << 4 = 110101000000 (v binarnem) = 3392 (v decimalnem) )

Primer # 5: Operaterji prestav

 #include int main() ( int num=212, i; for (i=0; i>i); printf(""); for (i=0; i<=2; ++i) printf("Left shift by %d: %d", i, num< 
 Right Shift by 0: 212 Right Shift by 1: 106 Right Shift by 2: 53 Left Shift by 0: 212 Left Shift by 1: 424 Left Shift by 2: 848 

Zanimive Članki...