Bitové pole - Bit field
Bitové pole je datová struktura , která se skládá z jednoho nebo více sousedních bitů, které byly přiděleny držet sled bitů , uložených tak, že každý jednotlivý bit nebo skupina bitů v rámci skupiny lze nastavit nebo kontrolovány. Bitové pole se nejčastěji používá k reprezentaci integrálních typů známé pevné bitové šířky.
Význam jednotlivých bitů v poli určuje programátor; například první bit v bitovém poli (umístěný na základní adrese pole ) se někdy používá k určení stavu konkrétního atributu spojeného s bitovým polem.
V CPU a jiných logických zařízeních se sbírky bitových polí nazývané „příznaky“ běžně používají k ovládání nebo k indikaci výsledku konkrétních operací. Procesory mají stavový registr, který se skládá z příznaků. Pokud například nelze v cíli reprezentovat výsledek přidání, je nastaveno aritmetické přetečení . Příznaky lze použít k rozhodování o následných operacích, například o pokynech podmíněného skoku . Například instrukce (Jump if Equal) v sestavovacím jazyce x86 bude mít za následek skok, pokud byl příznak Z (nula) nastaven nějakou předchozí operací.
JE ...
Bitové pole se odlišuje od bitového pole tím, že se používá k ukládání velké sady bitů indexovaných celými čísly a je často širší než jakýkoli integrální typ podporovaný jazykem. Bitová pole se naopak typicky vejdou do strojového slova a denotace bitů je nezávislá na jejich číselném indexu.
Implementace
Bitová pole lze použít ke snížení spotřeby paměti, když program vyžaduje řadu celočíselných proměnných, které budou mít vždy nízké hodnoty. Například v mnoha systémech ukládání celočíselné hodnoty vyžaduje dva bajty (16 bitů) paměti; někdy hodnoty, které mají být uloženy, ve skutečnosti potřebují pouze jeden nebo dva bity. Díky tomu, že řada těchto drobných proměnných sdílí bitové pole, umožňuje efektivní balení dat do paměti.
V C a C ++ lze nativní implementací definovaná bitová pole vytvořit pomocí unsigned int, signed int nebo (v C99 :) _Bool. V tomto případě může programátor deklarovat strukturu pro bitové pole, které označuje a určuje šířku několika podpolí. Souběžně deklarovaná bitová pole stejného typu pak může kompilátor sbalit do sníženého počtu slov ve srovnání s použitou pamětí, pokud by každé 'pole' mělo být deklarováno samostatně.
U jazyků postrádajících nativní bitová pole nebo tam, kde chce programátor mít kontrolu nad výslednou bitovou reprezentací, je možné ručně manipulovat s bity v rámci většího typu slova. V tomto případě může programátor nastavovat, testovat a měnit bity v poli pomocí kombinací maskovacích a bitových operací .
Příklady
Programovací jazyk C.
Deklarace bitového pole v C a C ++ :
// opaque and show
#define YES 1
#define NO 0
// line styles
#define SOLID 1
#define DOTTED 2
#define DASHED 3
// primary colors
#define BLUE 0b100
#define GREEN 0b010
#define RED 0b001
// mixed colors
#define BLACK 0 /* 000 */
#define YELLOW (RED | GREEN) /* 011 */
#define MAGENTA (RED | BLUE) /* 101 */
#define CYAN (GREEN | BLUE) /* 110 */
#define WHITE (RED | GREEN | BLUE) /* 111 */
const char* colors[8] = {"Black", "Red", "Green", "Yellow", "Blue", "Magenta", "Cyan", "White"};
// bit field box properties
struct BoxProps
{
unsigned int opaque : 1;
unsigned int fill_color : 3;
unsigned int : 4; // fill to 8 bits
unsigned int show_border : 1;
unsigned int border_color : 3;
unsigned int border_style : 2;
unsigned char : 0; // fill to nearest byte (16 bits)
unsigned char width : 4, // Split a byte into 2 fields of 4 bits
height : 4;
};
Rozložení bitových polí v C struct
je definováno implementací . Pro chování, které zůstává předvídatelné napříč kompilátory, může být vhodnější emulovat bitová pole s primitivními a bitovými operátory:
/* Each of these preprocessor directives defines a single bit,
corresponding to one button on the controller.
Button order matches that of the Nintendo Entertainment System. */
#define KEY_RIGHT 0b00000001
#define KEY_LEFT 0b00000010
#define KEY_DOWN 0b00000100
#define KEY_UP 0b00001000
#define KEY_START 0b00010000
#define KEY_SELECT 0b00100000
#define KEY_B 0b01000000
#define KEY_A 0b10000000
int gameControllerStatus = 0;
/* Sets the gameControllerStatus using OR */
void KeyPressed( int key ) { gameControllerStatus |= key; }
/* Clears the gameControllerStatus using AND and ~ (binary NOT)*/
void KeyReleased( int key ) { gameControllerStatus &= ~key; }
/* Tests whether a bit is set using AND */
int IsPressed( int key ) { return gameControllerStatus & key; }
Stavový registr procesoru
Procesor 6502 obsahuje příklad stavového registru bitových polí . Každé z jednotlivých bitových polí popisuje informace o stavu počítače:
- N Negativní vlajka
- Vlajka V oVerflow
- nepoužitý
- B Rozbít vlajku
- D Desítková vlajka
- I Přerušit-deaktivovat příznak
- Z nulová vlajka
- C Nést vlajku
S těmito bity není nutné manipulovat, protože jsou nastaveny procesorem jako výsledek operace a jsou vyhodnocovány explicitně definovanými pokyny pro větvení, například BVC (Branch on oVerflow Clear), BEQ (Branch Z = 0). Výjimkou je příznak I, u kterého byla výslovná instrukce SEI (SEt Interrupt Disable).
Extrahování bitů z vlajkových slov
Podskupinu příznaků v poli příznaku lze extrahovat pomocí ANDingu pomocí masky . Velký počet jazyků podporuje operátor posunu (<<), kde 1 << n
zarovná jeden bit do n -té polohy, většina také podporuje použití operátoru AND (&) k izolaci hodnoty jednoho nebo více bitů.
Pokud je stavový bajt ze zařízení 0x67 a 5. příznakový bit označuje připravenost k datům. Bajt masky je . Anding status-byte 0x67 ( v binární) s maskou-byte 0x20 ( v binární) vyhodnocen jako 0x20. To znamená, že je nastaven bit příznaku, tj. Zařízení má připravena data. Pokud by nebyl nastaven příznakový bit, vyhodnotilo by se to na 0, tj. Ze zařízení nejsou k dispozici žádná data.
0110 0111
0010 0000
Chcete -li zkontrolovat n -tý bit z proměnné v , proveďte operaci:
bool nth_is_set = (v & (1 << n)) != 0; bool nth_is_set = (v >> n) & 1;
Změna bitů ve vlajkových slovech
Zápis, čtení nebo přepínání bitů ve vlajkách lze provádět pouze pomocí operací OR, AND a NOT - operací, které lze v procesoru provádět rychle. Chcete -li nastavit bit, NEBO stavový bajt s bajtem masky. Ve výsledku budou nastaveny všechny bity nastavené v bajtu masky nebo stavovém bajtu.
Chcete -li trochu přepnout, XOR stavový bajt a maskový bajt. Tím se trochu nastaví, pokud je vymazáno, nebo trochu, pokud je nastaveno.
Viz také
- Binární kód
- Bitboard , používaný v šachu a podobných hrách.
- Bitové pole (nebo bitový řetězec)
- Word (počítačová architektura)
- Maska (výpočetní)
- Slovo o stavu programu
- Stavový registr
- Registrace FLAGS (výpočetní)
- Kontrolní registr
Reference
- ^ Penn Brumm; Don Brumm (srpen 1988). 80386 Jazyk sestavení: Kompletní výukový program a podprogramová knihovna . McGraw-Hill School Education Group. p. 606. ISBN 978-0-8306-9047-3.
- ^ a b Steve Oualline (1997). Praktické C programování . „O'Reilly Media, Inc.“. s. 403 -. ISBN 978-1-56592-306-5.
- ^ a b Michael A. Miller (leden 1992). Rodina mikroprocesorů 68000: architektura, programování a aplikace . Merrill. p. 323. ISBN 978-0-02-381560-7.
- ^ Ian Griffiths; Matthew Adams; Jesse Liberty (30. července 2010). Programování C# 4.0: Vytváření aplikací Windows, Web a RIA pro rozhraní .NET 4.0 Framework . „O'Reilly Media, Inc.“. s. 81–. ISBN 978-1-4493-9972-6.
- ^ Tibet Mimar (1991). Programování a projektování s řadou 68000: Včetně 68000, 68010/12, 68020 a 68030 . Prentický sál. p. 275. ISBN 978-0-13-731498-0.
- ^ a b Prata, Stephen (2007). C primer plus (5. vydání). Indianapolis, Ind: Sams. ISBN 978-0-672-32696-7.
- ^ Mark E. Daggett (13. listopadu 2013). Zkušený JavaScript . Stiskněte. s. 68–. ISBN 978-1-4302-6097-4.
- ^ InCider . W. Green. Ledna 1986. p. 108.