Peršokti į turinį

[C++] - Bitwise operatoriai.


Amxxl

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3965 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Sveiki šioje pamokoje pameginsiu paaiškinti kaip veikia bitwise operatoriai.

Čia yra bitwise opereratoriai:

& - AND - Bitwise AND

| - OR - Bitwise Inclusive OR

^ - XOR - Bitwise Exclusive OR

~ - NOT - Unary complement (bit inversion)

<< - SHL - Shift Left

>> - SHR - Shift Right

Kompiuterio mažiausias atminties vienetas yra baitas.

char kintamasis užema lygiai 1 baita Netiki?

#include <iostream>

int main()
{
   std::cout << sizeof(char) << "\n";
   system("pause");
   return 0;
}

Baitas turi 8 bitus kurie atrodo taip:

0000 0000 - 0

0000 0001 - 1

0000 0010 - 2

0000 0011 - 3

0000 0100 - 4

0000 0101 - 5

0000 0110 - 6

0000 0111 - 7

0000 1000 - 8

0000 1001 - 9

0000 1010 - 10

0000 1011 - 11

0000 1100 - 12

0000 1101 - 13

0000 1110 - 14

0000 1111 - 15

0001 0000 - 16

0001 0001 - 17

0001 0010 - 18

0001 0011 - 19

0001 0100 - 20

Gerai įsidėmėkit kaip keičiasi bitai kylant skaičiui.

skaičius 255 atrodytu taip:

1111 1111

kaip matote daugiau nera vietos, todėl 255 yra didžiausias

(unsigned char) duomenu tipui o char nuo -128 iki 127

(daugiau apie tai bus kai rasysiu apie ~NOT operatoriu).

Operatorius & AND:

0 ir 0 lygu 0

0 ir 1 lygu 0

1 ir 0 lygu 0

1 ir 1 lygu 1

Paimkime 2 skaičius 7 ir 10 ir palyginkime:

0000 0111 - 7

0000 1010 - 10

Rezultatas:

0000 0010 - 2

Pavizdys:

#include <iostream>

int main()
{
   std::cout << (7 & 10) << "\n";
   system("pause");
   return 0;
}

Operatorius | OR:

0 arba 0 lygu 0

0 arba 1 lygu 1

1 arba 0 lygu 1

1 arba 1 lygu 1

Paimkime 2 skaičius 11 ir 13 ir palyginkime:

0000 1011 - 11

0000 1101 - 13

Rezultatas:

0000 1111 - 15

Pavizdys:

#include <iostream>

int main()
{
   std::cout << (11 | 13) << "\n";
   system("pause");
   return 0;
}

Operatorius ^ XOR:

0 arba 0 bet ne abu lygu 0

1 arba 0 bet ne abu lygu 1

0 arba 1 bet ne abu lygu 1

1 arba 1 bet ne abu lygu 0

Paimkime 2 skaičius 12 ir 13 ir palyginkime:

0000 1100 - 12

0000 1101 - 13

Rezultatas:

0000 0001 - 1

Pavizdys:

#include <iostream>

int main()
{
   std::cout << (12 ^ 13) << "\n";
   system("pause");
   return 0;
}

Operatorius << Shift Left:

Paimkime skaičių

0000 0010 - 2

2 << 1 // Pastumiam vienų bitu į kairę

Rezultatas:

0000 0100 - 4

Pavizdys:

#include <iostream>

int main()
{
   std::cout << (2 << 1) << "\n";
   system("pause");
   return 0;
}

Operatorius >> Shift Right:

Kad daug neišsiplėsti tai čia taspats kas Shift Left tik

Stumiam Bitus į Dešinę. Beje skaičiai kurie užeina už duomenų

tipo rybų šiuo atveju vieno baito sunaikinami.

pvz:

0000 0101 - 5

5 >> 1 // Vienu bitu į dešinė

0000 0010 - 2

Pavizdys:

#include <iostream>

int main()
{
   std::cout << (5 >> 1) << "\n";
   system("pause");
   return 0;
}

Operatorius ~NOT:

Turbūt pats sudėtingiausias operatorius šiam operatoriui naudosim:

1111 0000 - -16

1111 0001 - -15

1111 0010 - -14

1111 0011 - -13

1111 0100 - -12

1111 0101 - -11

1111 0110 - -10

1111 0111 - -9

1111 1000 - -8

1111 1001 - -7

1111 1010 - -6

1111 1011 - -5

1111 1100 - -4

1111 1101 - -3

1111 1110 - -2

1111 1111 - -1

0000 0000 - 0

0000 0001 - 1

0000 0010 - 2

0000 0011 - 3

0000 0100 - 4

0000 0101 - 5

0000 0110 - 6

0000 0111 - 7

0000 1000 - 8

0000 1001 - 9

0000 1010 - 10

0000 1011 - 11

0000 1100 - 12

0000 1101 - 13

0000 1110 - 14

0000 1111 - 15

Dabar jums gali kilti klausimas aha!!!

1111 1111 - -1

1111 1111 - 255 Wtf? Taip būti negali kaip gali sutapti bitai kai reikšmes skiriasi?

Ankčiau pamokoje minejau kad parašysiu daugiau apie unsigned.

Taigi ką daro unsigned?

jis padaro išverstus bitus kaip maximalios reikšmes pratesima.

pvz buvo: char ( nuo -128 iki 127 ) tai unsigned char ( nuo 0 iki 255)

Paprasčiau 128 + 127 = 255

Pereikim prie ~NOT operatoriaus jis tiesiog išverčia bitus.

Kaip išversti bitus?

jei buvo 0 tai bus 1

o jei buvo 1 tai bus 0

Pavizdys:

0000 1110 - 14

1111 0001 - -15

#include <iostream>

int main()
{
   std::cout << ~14 << "\n";
   system("pause");
   return 0;
}

Jei nesupratote ko nors klauskite mielai padėsiu.

Redaguota , nario -amxxL-
  • Teigiamai 6
  • Neigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 3 savaičių...
(redaguota)

Kam to binary c++?

Sveikas, čia tiesiog informacija apie kompiuterio atmintį. Šiaip šie operatoriai daugiausiai naudojami enum flagams sudaryt.

#include <iostream>

// Kiekvienas flagas turi bito reiksme 1 skirtingoje vietoje
// Pavyzdys:
enum Flags
{
   FLAG_ADMIN      = 1 << 0,   // binary 0001
   FLAG_VIP        = 1 << 1,   // binary 0010
   FLAG_MODERATOR  = 1 << 2,   // binary 0100
   FLAG_MEMBER     = 1 << 3    // binary 1000
};
// Sudejus visus situs flagus (FLAG_ADMIN | FLAG_VIP | FLAG_MODERATOR | FLAG_MEMBER)
// gautusi binary 1111 tai yra 15

// 0000 - 0
// 0001 - 1
// 0010 - 2
// 0011 - 3
// 0100 - 4
// 0101 - 5
// 0110 - 6
// 0111 - 7
// 1000 - 8
// 1001 - 9
// 1010 - 10
// 1011 - 11
// 1100 - 12
// 1101 - 13
// 1110 - 14
// 1111 - 15

int main()
{
   std::cout << (FLAG_ADMIN | FLAG_MODERATOR) << "\n";
   system("pause");
   return 0;
}

Nauji nieko nesužinojau, o šeip tai nemanau kad čia dedi nebus tokiu kurie pradės programuoti čia sėdėdami smagu kad stengiesi bet kiti neįvertins to ir net nežiūrės nes net nesuvoks kas čia vyksta.

Nejau gi taip sunku suvokti skaičius 0 ir 1 Čia gi viskas vygsta tik su jais

Ir operatoriai: ir/arba/arba arba bet ne abu/pekeliam bitus į kaire/

perkeliam bitus į dešine/ išverčiam bitus. jug čia tik loginai operatoriai

kurie lygina dviejų skaičų binary numeri ir atitinkamai pagal logika ja keičia?

(išskyrus ~NOT bitų išvertimą, ir Left/Right shift bitu perkelimo operatorius)

jie skirti vienam skaičiui.

Redaguota , nario -amxxL-
  • Teigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 2 savaičių...

Kam to binary c++?

Visose aukšto lygio programavimo kalbose yra tokios funkcijos. Tai pat ir Java. Jos gali būti naudingos įvairiais atvejais, pvz.: spalvų manipuliavimui.

int spalva = 0x556688; // = 5596808
int red = (spalva >> 16) & 0xFF; //gaunasi 0x55 (= 85)
int green = (spalva >> 8) & 0xFF; //gaunasi 0x66 (= 102)
int blue = spalva & 0xFF; //gaunasi 0x88 (= 136)
int naujaSpalva = (red << 16) + (green << 8) + blue; //vėl 0x556688 (= 5596808)

Redaguota , nario ekgame
  • Teigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3965 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Svečias
Ši tema yra užrakinta.
  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...