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 structje 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 << nzarovná 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 01110010 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é

Reference

  1. ^ 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.
  2. ^ a b Steve Oualline (1997). Praktické C programování . „O'Reilly Media, Inc.“. s.  403 -. ISBN 978-1-56592-306-5.
  3. ^ a b Michael A. Miller (leden 1992). Rodina mikroprocesorů 68000: architektura, programování a aplikace . Merrill. p. 323. ISBN 978-0-02-381560-7.
  4. ^ 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.
  5. ^ 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.
  6. ^ a b Prata, Stephen (2007). C primer plus (5. vydání). Indianapolis, Ind: Sams. ISBN 978-0-672-32696-7.
  7. ^ Mark E. Daggett (13. listopadu 2013). Zkušený JavaScript . Stiskněte. s. 68–. ISBN 978-1-4302-6097-4.
  8. ^ InCider . W. Green. Ledna 1986. p. 108.

externí odkazy