Maska (výpočetní) - Mask (computing)
Ve vědě o počítačích , je maska či maskování jsou data, která se používá pro bitové operace , a to zejména v bitovém poli . Pomocí masky lze v jedné bitové operaci nastavit více bitů v bajtu , nibble , word atd. Buď zapnuto, vypnuto nebo invertováno ze zapnuto na vypnuto (nebo naopak). Další použití a význam maskování zahrnuje predikci ve zpracování Vector , kde bitová maska slouží k výběru, které operace s prvky ve Vectoru mají být provedeny (bit masky je povolen) a které nikoli (bit masky je jasný)
Běžné funkce bitové masky
Maskování bitů na 1
Chcete-li určité bity na se bitovéOR
operace může být použita, po zásada , že Y OR 1 = 1
a Y OR 0 = Y
. Proto, abyste se ujistili, že je bit zapnutý, OR
lze použít s 1
. Ponechat trochu beze změny, OR
se používá s 0
.
Příklad: Maskování na vyšší čtyři bity (bity 4, 5, 6, 7), spodní čtyři bity (bity 0, 1, 2, 3) beze změny.
10010101 10100101 OR 11110000 11110000 = 11110101 11110101
Maskování bitů na 0
Častěji v praxi, bity jsou „maskovány off “ (nebo zamaskovat 0
) než „maskované na “ (nebo maskované k 1
). Když je bit AND
upraven pomocí 0, výsledek je vždy 0, tzn Y AND 0 = 0
. Chcete-li nechat ostatní kousky tak, jak byly původně, mohou být AND
ed s 1
asY AND 1 = Y
Příklad: Maskování z vyšších půlbajta (bity 4, 5, 6, 7) spodní půlbajta (bity 0, 1, 2, 3) beze změny.
10010101 10100101 AND 00001111 00001111 = 00000101 00000101
Dotaz na stav bitů
Je možné použít bitmasky pro snadnou kontrolu stavu jednotlivých bitů bez ohledu na ostatní bity. Chcete -li to provést, vypněte všechny ostatní bity pomocí bitů, jak AND
je popsáno výše, a hodnota se porovná s 0
. Pokud se rovná 0
, pak byl bit vypnutý, ale pokud je hodnota jakákoli jiná hodnota, pak byl bit zapnutý. To, co je výhodné, je, že není nutné zjišťovat, jaká hodnota ve skutečnosti je, jen že není 0
.
Příklad: Dotaz na stav 4. bitu
10011101 10010101 AND 00001000 00001000 = 00001000 00000000
Přepínání bitových hodnot
Článek dosud pojednával o tom, jak zapnout a vypnout bity, ale ne obojí najednou. Někdy nezáleží na hodnotě, ale musí být opakem toho, co v současné době je. Toho lze dosáhnout pomocí operace XOR
(exclusive or) . XOR
vrací právě 1
tehdy, pokud je lichý počet bitů 1
. Pokud jsou tedy dva odpovídající bity 1
, výsledkem bude a 0
, ale pokud je pouze jeden z nich 1
, výsledek bude 1
. Inverze hodnot bitů se proto provádí jejich spojením XOR
s a 1
. Pokud byl původní bit 1
, vrátí se 1 XOR 1 = 0
. Pokud byl původní bit 0
, vrátí se 0 XOR 1 = 1
. Všimněte si také, že XOR
maskování je bitově bezpečné, což znamená, že neovlivní nemaskované bity, protože Y XOR 0 = Y
stejně jako OR
.
Příklad: Přepínání bitových hodnot
10011101 10010101 XOR 00001111 11111111 = 10010010 01101010
Chcete -li zapisovat libovolné 1 s a 0 s do podmnožiny bitů, nejprve zapište 0 s do této podmnožiny a poté nastavte vysoké bity:
register = (register & ~bitmask) | value;
Použití bitmasek
Argumenty na funkce
V programovacích jazycích, jako je C , jsou bitová pole užitečným způsobem, jak předat sadu pojmenovaných booleovských argumentů funkci. Například v grafickém rozhraní API OpenGL existuje příkaz, glClear()
který vymaže obrazovku nebo jiné vyrovnávací paměti. Může vymazat až čtyři vyrovnávací paměti (vyrovnávací paměti barvy, hloubky, akumulace a šablony ), takže autoři API mohli mít čtyři argumenty. Ale pak by volání na to vypadalo
glClear(1,1,0,0); // This is not how glClear actually works and would make for unstable code.
což není příliš popisné. Namísto toho jsou čtyři definované pole bitů GL_COLOR_BUFFER_BIT
, GL_DEPTH_BUFFER_BIT
, GL_ACCUM_BUFFER_BIT
a GL_STENCIL_BUFFER_BIT
a glClear()
je deklarován jako
void glClear(GLbitfield bits);
Potom volání funkce vypadá takto
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Interně může funkce využívající bitové pole takto and
extrahovat jednotlivé bity binárně . Implementace například glClear()
může vypadat takto:
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.
}
}
Výhodou tohoto přístupu je, že se sníží režie argumentu funkce. Protože je minimální velikost počátečního bodu jeden bajt, rozdělení voleb na samostatné argumenty by znamenalo ztrátu sedmi bitů na argument a zabíralo by více místa v zásobníku. Místo toho funkce obvykle přijímají jedno nebo více 32bitových celých čísel, přičemž v každém je až 32 volitelných bitů. Přestože je toto řešení v nejjednodušší implementaci bezpečné pro typ . A GLbitfield
je jednoduše definováno jako an unsigned int
, takže kompilátor umožní nesmyslné volání na glClear(42)
nebo dokonce glClear(GL_POINTS)
. V C ++ by bylo alternativou vytvořit třídu pro zapouzdření sady argumentů, které by glClear mohl přijmout a které by mohly být čistě zapouzdřeny v knihovně.
Inverzní masky
Masky se používají s IP adresami v IP ACL (Access Control Lists) k určení, co by mělo být povoleno a odepřeno. Chcete -li konfigurovat IP adresy na rozhraních, masky začínají na 255 a mají velké hodnoty na levé straně: například IP adresa 203.0.113.129 s maskou 255.255.255.224 . Masky pro IP ACL jsou naopak: například maska 0.0.0.255 . Někdy se tomu říká inverzní maska nebo zástupná maska . Když je hodnota masky rozdělena na binární (0 s a 1 s), výsledky určují, které bity adresy je třeba vzít v úvahu při zpracování provozu. 0 bitový znamená, že adresa bit třeba vzít v úvahu (přesná shoda); 1 bitový v masce je „do not care“. Tato tabulka dále vysvětluje koncept.
Příklad masky:
adresa sítě (provoz, který má být zpracován): 192.0.2.0
maska: 0,0.0,255
adresa sítě (binární): 11000000.0000000000.00000010.00000000
maska (binární): 00000000.0000000000.00000000.11111111
Na základě binární masky je vidět, že první tři sady ( oktety ) se musí přesně shodovat s danou binární adresou sítě (11000000.00000000.0000000010). Poslední sadu čísel tvoří „nezajímá mě“ (.11111111). Proto veškerý provoz, který začíná na „ 192.0.2. “, Odpovídá , protože poslední oktet je „je mi to jedno“. Proto jsou s touto maskou zpracovávány síťové adresy 192.0.2.0.1 až 192.0.2.0.255 ( 192.0.2.0.x ).
Odečtěte normální masku od 255.255.255.255 , abyste určili inverzní masku ACL. V tomto případě je inverzní maska určena pro síťovou adresu 198.51.100.0 s normální maskou 255.255.255.0 .
255.255.255.255 - 255.255.255.0 (normální maska) = 0,0.0.255 (inverzní maska)
Ekvivalenty ACL
Zdrojový / zdrojový zástupný znak 0,0.0.0 / 255.255.255.255 znamená „jakýkoli“.
Zdroj / zástupný znak 198.51.100.2 / 0.0.0.0 je stejný jako "hostitel 198.51.100.2 "
Obrazové masky
V počítačové grafice , když je daný obrázek určen k umístění na pozadí, lze průhledné oblasti určit pomocí binární masky. Tímto způsobem pro každý zamýšlený obrázek ve skutečnosti existují dvě bitmapy : skutečný obrázek, ve kterém jsou nepoužitým oblastem přiřazena hodnota pixelu se všemi bity nastavenými na 0 s, a další maska , ve které jsou odpovídajícím oblastem obrázku přiřazena hodnota pixelu všech bitů nastavených na 0 s a okolních oblastí hodnota všech bitů nastavená na 1 s. V ukázce vpravo mají černé pixely všechny nulové bity a bílé pixely mají všechny bity.
Za běhu , aby program umístil obrázek na obrazovku na pozadí, program nejprve maskuje bity pixelu obrazovky maskou obrazu na požadovaných souřadnicích pomocí bitové operace AND . Tím se zachovají pixely pozadí průhledných oblastí a resetují se nuly bity pixelů, které budou zakryty překrývajícím se obrázkem.
Poté program vykreslí bity obrazového pixelu kombinací s bity pixelu pozadí pomocí bitové operace NEBO . Tímto způsobem jsou obrazové pixely vhodně umístěny a přitom jsou zachovány okolní pixely. Výsledkem je dokonalá směs obrazu na pozadí.
Tato technika se používá k malování kurzorů ukazovacích zařízení, v typických 2-D videohrách pro postavy, kulky atd. ( Skřítci ), pro ikony GUI a pro titulkování videa a další aplikace pro míchání obrázků.
Přestože jsou transparentní barvy a alfa kanály podobné (vzhledem k tomu, že se používají ke stejným účelům), jedná se o techniky, které nezahrnují mix obrazových pixelů binárním maskováním.
Hashovací tabulky
K vytvoření hashovací funkce pro hashovací tabulku se často používá funkce, která má velkou doménu. Chcete -li vytvořit index z výstupu funkce, lze použít modulo ke zmenšení velikosti domény tak, aby odpovídala velikosti pole; na mnoha procesorech je však často rychlejší omezit velikost tabulky hash na mocniny dvou velikostí a místo toho použít bitovou masku.
Příklad modulo i maskování v 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;
}