Câmp de biți

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Un câmp de biți este o structură de date utilizată în programarea computerului . Acesta constă dintr-un număr de locații adiacente de memorie de calculator care au fost alocate pentru a deține o secvență de biți , stocate astfel încât fiecare bit sau grup de biți din set să poată fi adresat. [1] [2] Un câmp de biți este cel mai frecvent utilizat pentru a reprezenta tipuri de date primitive cu lățimea de biți fixă ​​cunoscută.

Semnificația biților individuali din câmp este determinată de programator; de exemplu, primul bit dintr-un câmp de biți (situat la adresa de bază a câmpului) este uneori folosit pentru a determina starea unui anumit atribut asociat cu câmpul de biți. [3]

În cadrul microprocesoarelor și al altor dispozitive logice, colecțiile de câmpuri de biți numite „semnalizatoare” sunt utilizate în mod obișnuit pentru a controla sau indica starea intermediară sau rezultatul anumitor operațiuni. [4] Microprocesoarele au în mod obișnuit un registru de stare compus din astfel de semnalizatoare, utilizat pentru a indica diverse condiții post-operație, cum ar fi o revărsare aritmetică . Steagurile pot fi citite și utilizate pentru a decide operațiunile ulterioare, ca și în procesarea condiționată a instrucțiunilor de salt . De exemplu, un JE ... JE ... JE ... (Salt dacă este egal) în limbajul de asamblare x86 va avea ca rezultat un salt dacă steagul Z (zero) a fost setat de o operație anterioară.

Un câmp de biți diferă de un tablou de biți prin faptul că acesta din urmă este utilizat pentru a stoca un set mare de biți indexați de numere întregi și este adesea mai mare decât orice tip integral suportat de limbaj. [ necesită citare ] Câmpurile de biți, pe de altă parte, se încadrează de obicei într-un cuvânt de computer [3] , iar denotația biților este independentă de indicele lor numeric. [2]

Implementare

Câmpurile de biți pot fi utilizate pentru a reduce consumul de memorie atunci când un program necesită un număr de variabile întregi care vor avea întotdeauna valori mici. De exemplu, în multe sisteme, stocarea unui număr întreg necesită doi octeți (16 biți) de memorie; uneori valorile care trebuie stocate au nevoie doar de unul sau doi biți. Faptul că o parte dintre aceste mici variabile împărtășesc un câmp de biți permite împachetarea eficientă a datelor în memorie. [5]

În C și C ++, câmpurile de biți definiți de implementarea nativă pot fi create folosind unsigned int , signed int sau, în C99, _Bool . În acest caz, programatorul poate declara o structură pentru un câmp de biți care etichetează și determină lățimea mai multor câmpuri secundare. [6] Câmpurile de biți de același tip declarate adiacente pot fi, prin urmare, împachetate de compilator într-un număr redus de cuvinte, comparativ cu memoria utilizată dacă fiecare „câmp” ar fi declarat separat.

Pentru limbile fără câmpuri de biți nativi sau în care programatorul dorește un control strict asupra reprezentării de biți rezultate, este posibil să se manipuleze manual biții într-un tip de cuvânt mai mare. În acest caz, programatorul poate seta, testa și schimba biții din câmp utilizând combinații de mascare și operații pe biți . [7]

Exemple

Limbaj de programare C

Declarația unui câmp de biți în C și C ++ :

 // ascuns și vizibil
#define DA 1
#define NO 0

// stiluri de linie
#define CONTINU 1
#define POINTED 2
#define HATCHED 3

// culori primare
#define ALBASTRU 4 / * 100 * /
#define GREEN 2 / * 010 * /
#define RED 1 / * 001 * /

// culori mixte
#define BLACK 0 / * 000 * /
#define GALBEN (ROȘU | VERDE) / * 011 * /
#define MAGENTA (RED | BLUE) / * 101 * /
#define CIAN (VERDE | ALBASTRU) / * 110 * /
#define ALB (ROSU | VERDE | ALBASTRU) / * 111 * /

const char * colors [ 8 ] = { "Black" , "Red" , "Green" , "Yellow" , "Blue" , "Magenta" , "Cyan" , "White" };

// Proprietăți ale structurii câmpurilor de câmp
struct PropBox
{
 nesemnat int opac : 1 ;
 unsigned int fill_color : 3 ;
 nesemnat int : 4 ; // Completați până la cel de-al optulea bit
 unsigned int show_edge : 1 ;
 unsigned int border_color : 3 ;
 unsigned int border_style : 2 ;
 caracter nesemnat : 0 ; // Completați până la cel mai apropiat octet (16 biți)
 lățime de caractere nesemnate : 4 , // Împarte un octet în două câmpuri de 4 biți
               înălțime : 4 ;
};

[6] Aspectul câmpurilor de biți într-o struct C este definit de implementare . Pentru a avea un comportament care rămâne previzibil între compilatoare, poate fi preferabil să se emule câmpuri de biți cu operatorii bit și non bit:

 / * Fiecare dintre aceste directive de preprocesare definește un singur bit,
corespunzătoare unui buton de pe controller. Ordinea butonului L
corespunde cu cel al Nintendo Entertainment System. * /
#define KEY_RIGHT (1 << 0) / * 00000001 * /
#define KEY_LEFT (1 << 1) / * 00000010 * /
#define KEY_DOWN (1 << 2) / * 00000100 * /
#define KEY_UP (1 << 3) / * 00001000 * /
#define KEY_START (1 << 4) / * 00010000 * /
#define KEY_SELECT (1 << 5) / * 00100000 * /
#define KEY_B (1 << 6) / * 01000000 * /
#define KEY_A (1 << 7) / * 10000000 * /

int gameControllerStatus = 0 ;

/ * Setați gameControllerStatus folosind SAU * /
void KeyPressed ( int key ) { gameControllerStatus | = key ; }

/ * Dezactivați o cheie în gameControllerStatus folosind AND și ~ (binar NU) * /
void KeyReleased ( cheie int ) { gameControllerStatus & = ~ key ; }

/ * Verificați dacă un bit este setat folosind ȘI * /
int IsPressed ( cheie int ) { return gameControllerStatus & key ; }

Notă

  1. ^ Penn Brumm și Don Brumm, 80386 Language Assembly: A Complete Tutorial and Subroutine Library , McGraw-Hill School Education Group, august 1988, p. 606, ISBN 978-0-8306-9047-3 .
  2. ^ a b Steve Oualline,Practical C Programming , "O'Reilly Media, Inc.", 1997, pp. 403 -, ISBN 978-1-56592-306-5 .
  3. ^ a b Michael A. Miller, The 68000 Microprocessor Family: Architecture, Programming, and Applications , Merrill, ianuarie 1992, p. 323, ISBN 978-0-02-381560-7 .
  4. ^ Ian Griffiths, Matthew Adams și Jesse Liberty, Programare C # 4.0: Construirea aplicațiilor Windows, Web și RIA pentru .NET 4.0 Framework , "O'Reilly Media, Inc.", 30 iulie 2010, pp. 81–, ISBN 978-1-4493-9972-6 .
  5. ^ Tibet Mimar, Programare și proiectare cu familia 68000: inclusiv 68000, 68010/12, 68020 și 68030 , Prentice Hall, 1991, p. 275, ISBN 978-0-13-731498-0 .
  6. ^ a b Stephen Prata, C primer plus , ediția a 5-a, Indianapolis, Ind, Sams, 2007, ISBN 978-0-672-32696-7 .
  7. ^ Mark E. Daggett, Expert JavaScript , Apress, 13 noiembrie 2013, pp. 68–, ISBN 978-1-4302-6097-4 .

Elemente conexe

linkuri externe