C pentru începători

Treceți la dreapta cu sarcina

expr1 >> = expr2

) modifică valoarea fiecărui bit al operandului. Bitul setat la 1 modifică valoarea la 0 și invers.
Operatorii de schimburi (<<,>>) mutați biții în operan-tul stâng de numărul de poziții specificat de operandul drept. „The radiați exterior“ biți sunt pierdute, eliberat de biți (dreapta la stânga pentru deplasare, deplasarea la dreapta la stânga) sunt umplute cu zerouri. Cu toate acestea, trebuie amintit că, pentru bitul de deplasare dreapta la stânga umplere zerouri garantate numai pentru operanzii fără semn de semnat, în unele implementări pot umple valoarea semnul (stânga) bit.






Bitul AND () aplică operația AND tuturor biților operanzilor săi. Fiecare bit al operandului din stânga este comparat cu bitul drept din aceeasi pozitie. Dacă ambele biți sunt 1, bitul la acea poziție i se atribuie valoarea 1 în orice alt caz - 0. (la nivel de bit și () nu trebuie confundat cu logică AND (), dar, din păcate, fiecare programator puțin o dată în viață a făcut eroare similară ).
Exemplu de biți EXCLUSIVE sau (^) compară biții operanzi. Bitul corespunzător al rezultatului este 1 dacă operanzii sunt diferiți (unul este 0 și celălalt este 1). Dacă ambii operanzi sunt egali, rezultatul este 0.
Bitwise OR (|) aplică o operație de adăugare logică la fiecare bit al operanților. Pozițiile biți în rezultatul i se atribuie valoarea 1 dacă cel puțin unul din biții corespunzători ai operanzilor este 1 și 0 când biții ambii operanzi sunt 0. (bitwise OR nu trebuie confundat cu logică OR.)
Să luăm în considerare un exemplu simplu. Să avem o clasă de 30 de studenți. În fiecare săptămână profesorul efectuează un test, rezultatul căruia este trecut / eșuat. Rezultatele pot fi reprezentate ca un vector bit. (Rețineți că biții sunt numerotate pornind de la zero, primul bit este de fapt al doilea într-un rând, cu toate acestea, pentru comoditate, nu vom folosi un pic de zero, astfel încât numărul de student 1 corespunde cu numărul de biți de 1. În final, profesorul nostru - nu un specialist. în domeniul programării.)







Trebuie să putem modifica valoarea fiecărui bit și să verificăm această valoare. Să presupunem că un student a trecut testul. Bitul 27 trebuie să fie setat la 1, fără a schimba valoarea celorlalți biți. Acest lucru se poate face în două etape. Mai întâi trebuie să începeți cu un număr care conține 1 în biți 27 și 0 în altele. Pentru a face acest lucru, folosim operația de schimbare:

Aplicând operația bitwise OR la ​​variabila quiz1 și constanta noastră, obținem rezultatul dorit: valoarea bitului 27 va deveni egală cu valoarea 1, iar ceilalți biți vor rămâne neschimbați.

Acum, imaginați-vă că profesorul a verificat rezultatele testului și a aflat că elevul nu a trecut testul. Acum trebuie să atribuiți un zero la bitul 27, fără să atingeți celelalte. Mai întâi, aplicăm o notă de biți NU la constanta anterioară și obținem un număr în care toți biți, cu excepția celui de-al 27-lea, sunt 1:

Acum vom multiplica (I) această constantă cu quiz1 bit-by-bit și obținem rezultatul dorit: 0 în bitul 27 și valorile invariabile ale celorlalte.

Cum se verifică valoarea aceluiași 27-biți? Bit-ul AND dă adevărat dacă bitul 27 este 1 și false dacă 0:

Dacă utilizați operații bitwise în acest fel, este foarte ușor să faceți o greșeală. Prin urmare, cele mai multe ori astfel de operațiuni sunt încapsulate în macro-uri preprocesor sau funcții încorporate:

Iată un exemplu de utilizare:

Deoarece am început să încapsulăm acțiunile cu vectorul de biți în funcție, următorul pas este să creezi o clasă. Biblioteca standard C ++ include o astfel de bitset de clasă, utilizarea sa este descrisă mai jos.

Exercitarea 4.12

Se dau două numere întregi:
unsigned int ui1 = 3, ui2 = 7;
Care este rezultatul expresiilor următoare?
(a) ui1 ui2 (c) uil | UI2
(b) ui1 ui2 (d) uil || UI2

Exercitarea 4.13

Folosind exemplul bit_on () funcția de a crea bit_turn_on () funcție (expune bitul la 1), bit_turn_off () (resetărilor bit 0), flip_bit () (schimbă valoarea opus) și bit_off () (returnează true, dacă bitul este 0 ). Scrieți un program care utilizează funcțiile.

Exercitarea 4.14

Care este lipsa funcțiilor de la exercițiul anterior utilizând tipul int unsigned? Implementarea lor poate fi îmbunătățită prin utilizarea unei definiții de tip typedef sau a unui mecanism al funcției șablonului. Rescrie funcția bit_on () de către prima typedef și apoi motorul șablonului.







Articole similare

Trimiteți-le prietenilor: