biteittäin Operatorit C:ssa: AND, OR, XOR, Shift & Täydentää

⚡ Älykäs yhteenveto

C-kielen bittikohtaisia ​​operaattoreita käytetään datan käsittelyyn yksittäisen bitin tasolla käyttämällä AND-, OR-, XOR-, komplementti- ja siirto-operaatioita kokonaislukuoperandeille nopeampien laskutoimitusten suorittamiseksi, lippujen pakkaamiseksi ja laitteiston ohjaamiseksi matalan tason ja sulautetussa ohjelmoinnissa.

  • 🧮 Operatorit: Kuusi operaattoria — JA (&), TAI (|), XTAI (^), komplementti (~), vasen siirto (<<), oikea siirto (>>) — toimivat pala palalta.
  • 🔗 JA & TAI: &-tulos on 1 vain, kun molemmat bitit ovat 1; |-tulos on 1, kun jompikumpi bitti on 1.
  • 🔀 XOR: ^-tulos on 1, kun tasan yksi bitti on 1, kätevä bittien vaihtamiseen ja vaihtamiseenping arvot.
  • ↔️ Shifts: <<- ja >>-operaattorit liu'uttavat bittejä vasemmalle tai oikealle kertomalla tai jakamalla kahden potensseilla.
  • 🔁 Täydentää: ~-operaattori kääntää jokaisen bitin, joten luvusta 0000 1111 tulee 1111 0000.
  • 🤖 Tekoälyn apu: Tekoälyavustajat ja GitHub Copilot luovat ja selittävät bittimaski- ja siirtologiikan nopeasti.

biteittäin OperaC-kielen tekijät

Mitä ovat Bitwise Operators?

biteittäin OperaOhjelmoinnissa käytetään datan käsittelyyn bittitasolla, jota kutsutaan myös bittitason ohjelmoinniksi. Bittikohtainen ohjelmointi käsittelee yhtä tai useampaa bittikuviota tai binäärinumeroa niiden yksittäisten bittien tasolla. Niitä käytetään numeerisissa laskennoissa laskentaprosessin nopeuttamiseksi.

Seuraavassa on luettelo C-ohjelmointikielen tarjoamista bittikohtaisista operaattoreista:

OperaTor Merkitys
& Bittikohtainen AND-operaattori
| Bittikohtainen OR-operaattori
^ Bittikohtainen yksinomainen OR-operaattori
~ Binaarisen ykkösen komplementti Operator on yksipuolinen operaattori
<< Vasen vaihdeoperaattori
>> Oikean vaihteen kuljettaja

Bittikohtaisia ​​operaattoreita ei voida soveltaa suoraan alkeellisiin tietotyyppeihin, kuten float, double jne. Muista aina yksi asia, että bittikohtaisia ​​operaattoreita käytetään enimmäkseen kokonaislukutietotyyppi yhteensopivuutensa vuoksi.

Bittikohtaiset loogiset operaattorit käsittelevät dataa bitti kerrallaan alkaen vähiten merkitsevästä bitistä eli LSB-bitistä, joka on äärimmäisen oikealla oleva bitti, kohti MSB:tä (Most Significant Bit), joka on vasemmanpuoleisin bitti.

Bittikohtaisten loogisten operaattoreiden laskennan tulos on esitetty alla olevassa taulukossa.

x y x & y x | siellä x^y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Bittisesti JA

Tämä on yksi yleisimmin käytetyistä loogisista bittikohtaisista operaattoreista. Sitä edustaa yksi et-merkki (&). Kaksi kokonaislukulauseketta kirjoitetaan (&)-operaattorin kummallekin puolelle.
Bittikohtaisen JA-operaation tulos on 1, jos molempien bittien arvo on 1; muuten tulos on aina 0.

Oletetaan, että meillä on 2 muuttujaa op1 ja op2, joiden arvot ovat seuraavat:

Op1 = 0000 1101
Op2 = 0001 1001

AND-operaation tulos muuttujilla op1 ja op2 on

Result = 0000 1001

Kuten näemme, kahta muuttujaa verrataan vähän kerrallaan. Aina kun bitin arvo molemmissa muuttujissa on 1, tulos on 1 tai muuten 0.

Bittaisesti TAI

Sitä edustaa yksi pystysuora palkkimerkki (|). Kaksi kokonaislukulauseketta kirjoitetaan operaattorin (|) molemmille puolille.

Bittikohtaisen TAI-operaation tulos on 1, jos ainakin yhden lausekkeen arvo on 1; muuten tulos on aina 0.

Oletetaan, että meillä on 2 muuttujaa op1 ja op2, joiden arvot ovat seuraavat:

Op1 = 0000 1101
Op2 = 0001 1001

TAI-operaation tulos muuttujilla op1 ja op2 on

Result = 0001 1101

Kuten näemme, kahta muuttujaa verrataan vähän kerrallaan. Aina kun jonkin muuttujan bitin arvo on 1, tulos on 1 tai muuten 0.

Bitwise Exclusive TAI

Sitä edustaa symboli (^). Kaksi kokonaislukulauseketta kirjoitetaan operaattorin (^) molemmille puolille.

Bittikohtaisen Exclusive-OR-operaation tulos on 1, jos vain yhden lausekkeen arvo on 1; muuten tulos on aina 0.

Oletetaan, että meillä on 2 muuttujaa op1 ja op2, joiden arvot ovat seuraavat:

Op1 = 0000 1101
Op2 = 0001 1001

XOR-operaation tulos muuttujilla op1 ja op2 on

Result = 0001 0100

Kuten näemme, kahta muuttujaa verrataan vähän kerrallaan. Aina kun vain yhdellä muuttujalla on arvo 1, tulos on 0, muuten tulos on 0.

Kirjoitetaan yksinkertainen ohjelma, joka esittää bittikohtaisia ​​loogisia operaattoreita.

#include <stdio.h>
int main() 
{
int a = 20;	/* 20 = 010100 */  
int b = 21;	/* 21 = 010101 */
int c = 0;           

c = a & b;       /* 20 = 010100 */ 
printf("AND - Value of c is %d\n", c );

c = a | b;       /* 21 = 010101 */
printf("OR - Value of c is %d\n", c );

c = a ^ b;       /* 1 = 0001 */
printf("Exclusive-OR - Value of c is %d\n", c );

getch();
}

lähtö:

AND - Value of c is 20
OR - Value of c is 21
Exclusive-OR - Value of c is 1

Bittisiirtooperaattorit

Bittikohtaisia ​​siirto-operaattoreita käytetään bittikuvioiden siirtämiseen joko vasemmalle tai oikealle. Vasen ja oikea ovat kaksi siirto-operaattoria, jotka 'C' antaa ja joita esitetään seuraavasti:

Operand << n (Left Shift)
Operand >> n (Right Shift)

Täällä

  • operandi on kokonaislukulauseke, jolle meidän on suoritettava siirtotoiminto.
  • 'n' on niiden bittipaikkojen kokonaismäärä, jotka meidän on siirrettävä kokonaislukulausekkeessa.

Vasemmanpuoleinen siirtotoiminto siirtää "n" bittien määrän vasemmalle puolelle. Lausekkeen vasemmanpuoleisin bitti ponnahtaa esiin ja n bittiä, joiden arvo on 0, täytetään oikealla puolella.

Oikea siirtotoiminto siirtää 'n' bittien määrän oikealle puolelle. Lausekkeen oikeanpuoleisin 'n'-bitti ponnahtaa esiin, ja arvo 0 täytetään vasemmalla puolella.

Esimerkki: x on kokonaislukulauseke, jonka data on 1111. Siirtotoiminnon suorittamisen jälkeen tulos on:

x << 2 (left shift) = 1111<<2 = 1100
x>>2 (right shift) = 1111>>2 = 0011

Shifts-operaattoreita voidaan yhdistää, jolloin sitä voidaan käyttää esimerkiksitract kokonaislukulausekkeen tiedot. Kirjoitetaan ohjelma, joka demonstroi bittikohtaisten siirto-operaattoreiden käyttöä.

#include <stdio.h>
int main() {
int a = 20;	/* 20 = 010100 */  
int c = 0;           

c = a << 2;	/* 80 = 101000 */
printf("Left shift - Value of c is %d\n", c );

c = a >> 2;	/*05 = 000101 */
printf("Right shift - Value of c is %d\n", c );
return 0;
}

lähtö:

Left shift - Value of c is 80
Right shift - Value of c is 5

Vasemman siirtotoiminnon suorittamisen jälkeen arvoksi tulee 80, jonka binäärivastine on 101000.

Oikean siirtotoiminnon suorittamisen jälkeen arvoksi tulee 5, jonka binäärivastine on 000101.

Bittikomplementtioperaattori

Bittikohtaista komplementtia kutsutaan myös komplementtioperaattoriksi, koska se ottaa aina vain yhden arvon tai operandin. Se on yksipuolinen operaattori.

Kun suoritamme komplementin mille tahansa bitille, kaikista ykkösistä tulee nollia ja päinvastoin.

Jos meillä on kokonaislukulauseke, joka sisältää 0000 1111, bittikohtaisen komplementtioperaation suorittamisen jälkeen arvoksi tulee 1111 0000.

Bittikomplementtioperaattori on merkitty symbolilla tilde (~).

Kirjoitetaan ohjelma, joka esittelee bittikohtaisen komplementtioperaattorin toteutusta.

#include <stdio.h>
int main() {
int a = 10;	/* 10 = 1010 */  
int c = 0;           
c = ~(a);      
printf("Complement - Value of c is %d\n", c );
return 0;
}

lähtö:

Complement - Value of c is -11

Tässä on toinen ohjelma, jossa on esimerkki kaikista tähän mennessä käsitellyistä operaattoreista:

#include <stdio.h>
main() {
unsigned int x = 48;	/* 48 = 0011 0000 */  
unsigned int y = 13;	/* 13 = 0000 1101 */
int z = 0;           

z =x & y;       /* 0 = 0000 0000 */ 
printf("Bitwise AND Operator - x & y = %d\n", z );

z = x | y;       /* 61 = 0011 1101 */
printf("Bitwise OR Operator - x | y = %d\n", z );

z= x^y;       /* 61 = 0011 1101 */
printf("Bitwise XOR Operator- x^y= %d\n", z);

z = ~x;          /*-49 = 11001111 */
printf("Bitwise One's Complement Operator - ~x = %d\n", z);

z = x << 2;     /* 192 = 1100 0000 */
printf("Bitwise Left Shift Operator x << 2= %d\n", z );

z= x >> 2;     /* 12 = 0000 1100 */
printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}

Kun olemme kääntäneet ja suorittaneet ohjelman, se tuottaa seuraavan tuloksen:

Bitwise AND Operator - x & y = 0
Bitwise OR Operator - x | y = 61
Bitwise XOR Operator- x^y= 61
Bitwise One's Complement Operator - ~x = -49
Bitwise Left Shift Operator x << 2= 192
Bitwise Right Shift Operator x >> 2= 12

UKK

Bittikohtainen JA (&) käsittelee yksittäisiä bittejä ja palauttaa kokonaisluvun, kun taas looginen JA (&&) testaa kokonaisia ​​lausekkeita ja palauttaa yhden tosi- tai epätosi-totuusarvon.

Shift 1 maskin luomiseksi: aseta arvolla | (1 << n), tyhjennä arvolla & ~(1 << n) ja vaihda arvolla ^ (1 << n).

Vasemmalle siirtäminen n:llä kertoo etumerkitön arvon kahdella korotettuna n:ään; oikealle siirtäminen jakaa sillä, joten kääntäjät käyttävät siirtoja nopeuden lisäämiseksi.

Tarkista numero & 1. Alin bitti palauttaa arvon 1 parittomille arvoille ja 0 parillisille arvoille, nopeammin kuin modulusoperaattori.

Sulautetut laiteohjelmistot, ajurit, kryptografia, pakkaus, grafiikka ja verkot käyttävät niitä lippujen pakkaamiseen, laitteistorekisterien lukemiseen, käyttöoikeusmaskien rakentamiseen ja aritmetiikan nopeuttamiseen.

Shift operaattorit sitovat toisiaan tiukemmin kuin relaatiooperaattorit, kun taas &, ^ ja | ovat tasa-arvon alapuolella, mutta loogisen &&- ja ||-operaattorin yläpuolella, joten käytä suluissa varmuuden vuoksi.

Kyllä. Tekoälykoodausavustaja kirjoittaa maskeja ja siirtyy kehotteesta toiseen, selittää negatiiviset komplementit ja muuntaa binääriesimerkit toimivaksi C-koodiksi. Testaa aina tulos.

GitHub Copilot ehdottaa bittimaskimakroja, bittien asettamis- ja tyhjentämisapureita sekä shift-matematiikkaa kommentista; vertaa sen täydennyksiä bittiasetteluun.

Tiivistä tämä viesti seuraavasti: