Mască (informatică)
Argumente la funcțiiEdit
În limbaje de programare precum C, câmpurile de biți sunt o modalitate utilă de a transmite un set de argumente booleene numite unei funcții. De exemplu, în API-ul grafic OpenGL, există o comandă, glClear()
, care șterge ecranul sau alte tampoane. Aceasta poate șterge până la patru tampoane (tampoanele de culoare, de adâncime, de acumulare și de stencil), astfel încât autorii API-ului ar fi putut să o facă să primească patru argumente. Dar atunci un apel ar fi arătat ca
glClear(1,1,0,0); // This is not how glClear actually works and would make for unstable code.
, ceea ce nu este foarte descriptiv. În schimb, există patru biți de câmp definiți, GL_COLOR_BUFFER_BIT
, GL_DEPTH_BUFFER_BIT
, GL_ACCUM_BUFFER_BIT
și GL_STENCIL_BUFFER_BIT
, iar glClear()
este declarat ca
void glClear(GLbitfield bits);
Apoi un apel la funcție arată astfel
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Intern, o funcție care preia un câmp de biți ca acesta poate folosi binarul and
pentru a extrage biții individuali. De exemplu, o implementare a lui glClear()
ar putea arăta astfel:
void glClear(GLbitfield bits) { if ((bits & GL_COLOR_BUFFER_BIT) != 0) { // Clear color buffer. } if ((bits & GL_DEPTH_BUFFER_BIT) != 0) { // Clear depth buffer. } if ((bits & GL_ACCUM_BUFFER_BIT) != 0) { // Clear accumulation buffer. } if ((bits & GL_STENCIL_BUFFER_BIT) != 0) { // Clear stencil buffer. }}
Avantajul acestei abordări este că se diminuează sarcina de argumentare a funcției. Deoarece dimensiunea minimă a datelor este de un octet, separarea opțiunilor în argumente separate ar însemna să se irosească șapte biți pentru fiecare argument și să se ocupe mai mult spațiu în stivă. În schimb, funcțiile acceptă de obicei unul sau mai multe numere întregi de 32 de biți, cu până la 32 de biți de opțiune în fiecare. Deși elegantă, în cea mai simplă implementare această soluție nu este sigură din punct de vedere al tipului. Un GLbitfield
este definit pur și simplu ca fiind un unsigned int
, astfel încât compilatorul ar permite un apel fără sens la glClear(42)
sau chiar glClear(GL_POINTS)
. În C++, o alternativă ar fi crearea unei clase care să încapsuleze setul de argumente pe care glClear le-ar putea accepta și ar putea fi încapsulate în mod curat într-o bibliotecă.
Măști inverseEdit
Măștile sunt folosite cu adrese IP în IP ACL (Access Control Lists) pentru a specifica ce ar trebui să fie permis și ce ar trebui refuzat. Pentru a configura adrese IP pe interfețe, măștile încep cu 255 și au valorile mari în partea stângă: de exemplu, adresa IP 209.165.202.129 cu o mască 255.255.255.255.224. Măștile pentru ACL-urile IP sunt invers: de exemplu, masca 0.0.0.0.255. Aceasta se numește uneori o mască inversă sau o mască wildcard. Atunci când valoarea măștii este împărțită în binar (0 și 1), rezultatele determină ce biți de adresă trebuie luați în considerare la procesarea traficului. Un 0 indică faptul că biții de adresă trebuie să fie luați în considerare (potrivire exactă); un 1 în mască este un „nu-mi pasă”. Acest tabel explică mai detaliat conceptul.
Exemplu de mască:
adresa de rețea (traficul care trebuie procesat) 10.1.1.0
mască0.0.0.255
adresa de rețea (binar)00001010.00000001.00000001.00000001.00000000
mască (binară)00000000.00000000.00000000.00000000.1111111111
Pe baza măștii binare, se poate observa că primele trei seturi (octeți) trebuie să corespundă exact adresei de rețea binare date (00001010.00000001.00000001.00000001). Ultimul set de numere este format din „don’t cares” (.1111111111). Prin urmare, tot traficul care începe cu 10.1.1. se potrivește, deoarece ultimul octet este „don’t care”. Prin urmare, cu această mască sunt procesate adresele de rețea de la 10.1.1.1.1.1 până la 10.1.1.1.255 (10.1.1.x).
Substrăgeți masca normală din 255.255.255.255.255 pentru a determina masca inversă ACL. În acest exemplu, masca inversă este determinată pentru adresa de rețea 172.16.1.0 cu o mască normală de 255.255.255.255.0.
255.255.255.255.255 – 255.255.255.255.255.0 (masca normală) = 0.0.0.0.255 (masca inversă)
Echivalențe ACL
Sursa/sursă wildcard de 0.0.0.0/255.255.255.255.255 înseamnă „orice”.
Sursa/sursă wildcard de 10.1.1.2/0.0.0.0.0 este același lucru cu „host 10.1.1.2”
Măști de imagineEdit
În grafica pe calculator, atunci când o anumită imagine este destinată a fi plasată peste un fundal, zonele transparente pot fi specificate printr-o mască binară. În acest fel, pentru fiecare imagine preconizată există de fapt două hărți bitice: imaginea propriu-zisă, în care zonele neutilizate primesc o valoare a pixelilor cu toți biții setați la 0s, și o mască suplimentară, în care zonele corespunzătoare ale imaginii primesc o valoare a pixelilor cu toți biții setați la 0s, iar zonele înconjurătoare o valoare a tuturor biților setați la 1s. În exemplul din dreapta, pixelii negri au toți biții cu zero, iar pixelii albi au toți biții cu unu.
În timpul rulării, pentru a pune imaginea pe ecran peste fundal, programul maschează mai întâi biții pixelului ecranului cu masca imaginii la coordonatele dorite, folosind operația bitwise AND. Acest lucru păstrează pixelii de fundal din zonele transparente, în timp ce resetează cu zero biții pixelilor care vor fi acoperiți de imaginea suprapusă.
Apoi, programul redă biții pixelilor imaginii prin combinarea lor cu biții pixelilor de fundal folosind operația „bitwise OR”. În acest fel, pixelii imaginii sunt plasați în mod corespunzător, păstrând în același timp pixelii din jurul fundalului. Rezultatul este o compunere perfectă a imaginii peste fundal.
Această tehnică este utilizată pentru pictarea cursorilor dispozitivelor de indicare, în jocurile video 2D tipice pentru personaje, gloanțe și așa mai departe (sprites), pentru pictogramele GUI și pentru titrări video și alte aplicații de amestecare a imaginilor.
Deși sunt înrudite (datorită faptului că sunt folosite în aceleași scopuri), culorile transparente și canalele alfa sunt tehnici care nu implică amestecarea pixelilor imaginii prin mascare binară.
Tabele de hașurareEdit
Pentru a crea o funcție de hașurare pentru un tabel de hașurare, se folosește adesea o funcție care are un domeniu mare. Pentru a crea un index de la ieșirea funcției, se poate lua un modulo pentru a reduce dimensiunea domeniului pentru a se potrivi cu dimensiunea tabloului; cu toate acestea, este adesea mai rapid pe multe procesoare să se restrângă dimensiunea tabelului hash la puteri de două mărimi și să se folosească în schimb o mască de biți.
Un exemplu atât de modulo cât și de mascare în C:
#include <stdint.h>#include <string.h>int main(void) { const uint32_t NUM_BUCKETS = 0xFFFFFFFF; // 2^32 - 1 const uint32_t MAX_RECORDS = 1<<10; // 2^10 const uint32_t HASH_BITMASK = 0x3FF; // (2^10)-1 char **token_array = NULL; // Handle memory allocation for token_array… char token = "some hashable value"; uint32_t hashed_token = hash_function(token, strlen(token), NUM_BUCKETS); // Using modulo size_t index = hashed_token % MAX_RECORDS; // OR // Using bitmask size_t index = hashed_token & HASH_BITMASK; *(token_array+index) = token; // Free the memory from token_array … return 0;}
.