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 = 1a Y OR 0 = Y. Proto, abyste se ujistili, že je bit zapnutý, ORlze použít s 1. Ponechat trochu beze změny, ORse 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 ANDupraven 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 ANDed s 1asY 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 ANDje 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) . XORvrací 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 XORs 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 XORmaskování je bitově bezpečné, což znamená, že neovlivní nemaskované bity, protože Y XOR 0 = Ystejně 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

Párty trik k uhádnutí čísla, ze kterého je karta vytištěna, využívá bity binární reprezentace čísla. V souboru SVG přepnete kliknutím na kartu

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_BITa GL_STENCIL_BUFFER_BITa 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 andextrahovat 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 GLbitfieldje 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.1192.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

Rastrové grafické skřítky (vlevo) a masky (vpravo)

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í.

Vykreslování spritu binárním obrázkem mask.png

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;
}

Viz také

Reference