Camp de bit

De la Viquipèdia, l'enciclopèdia lliure

Un camp de bits és una estructura de dades que consta d'un o més bits adjacents que s'han assignat per a propòsits específics, de manera que qualsevol bit o grup de bits dins de l'estructura es pot configurar o inspeccionar.[1][2] Un camp de bits s'utilitza més habitualment per representar tipus integrals d'amplada de bits fix conegut, com ara booleans d'un sol bit.

El significat dels bits individuals dins del camp el determina el programador; per exemple, de vegades s'utilitza el primer bit d'un camp de bits (situat a l'adreça base del camp) per determinar l'estat d'un atribut particular associat al camp de bits.[3]

Dins de les CPU i altres dispositius lògics, s'utilitzen col·leccions de camps de bits anomenats flags per controlar o indicar el resultat d'operacions particulars.[4] Els processadors tenen un registre d'estat que es compon de banderes. Per exemple, si el resultat d'una suma no es pot representar a la destinació, s'estableix un desbordament aritmètic. Els indicadors es poden utilitzar per decidir operacions posteriors, com ara instruccions de salt condicionals. Per exemple, un JE ... La instrucció (Jump if Equal) en el llenguatge ensamblador x86 donarà lloc a un salt si el senyalador Z (zero) s'ha establert per alguna operació anterior.

Un camp de bits es distingeix d'una matriu de bits perquè aquest últim s'utilitza per emmagatzemar un gran conjunt de bits indexats per nombres enters i sovint és més ampli que qualsevol tipus integral suportat pel llenguatge. Els camps de bits, d'altra banda, solen encaixar dins d'una paraula màquina,[5] i la denotació dels bits és independent del seu índex numèric.[6]

Implementació[modifica]

Els camps de bits es poden utilitzar per reduir el consum de memòria quan un programa requereix un nombre de variables senceres que sempre tindran valors baixos. Per exemple, en molts sistemes emmagatzemar un valor enter requereix dos bytes (16 bits) de memòria; de vegades, els valors a emmagatzemar només necessiten un o dos bits. Tenir un nombre d'aquestes petites variables que comparteixen un camp de bits permet empaquetar de manera eficient les dades a la memòria.[7]

En C i C++, els camps de bits definits per implementació natius es poden crear utilitzant unsigned int, signed int o (en C99) _Bool . En aquest cas, el programador pot declarar una estructura per a un camp de bits que etiqueta i determina l'amplada de diversos subcamps.[8] Els camps de bits declarats adjacents del mateix tipus es poden empaquetar pel compilador en un nombre reduït de paraules, en comparació amb la memòria utilitzada si cada "camp" s'hagués de declarar per separat.

Per als idiomes que no tenen camps de bits natius, o on el programador vol controlar la representació de bits resultant, és possible manipular manualment els bits dins d'un tipus de paraula més gran. En aquest cas, el programador pot establir, provar i canviar els bits al camp mitjançant combinacions d'emmascarament i operacions per bits.[9]

Example en C programming language[modifica]

Declaració d'un camp de bits en C i C++ : [10]

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

Referències[modifica]

  1. Penn Brumm. 80386 Assembly Language: A Complete Tutorial and Subroutine Library (en anglès). McGraw-Hill School Education Group, agost 1988, p. 606. ISBN 978-0-8306-9047-3. 
  2. Steve Oualline. Practical C Programming (en anglès). "O'Reilly Media, Inc.", 1997, p. 403–. ISBN 978-1-56592-306-5. 
  3. Michael A. Miller. The 68000 Microprocessor Family: Architecture, Programming, and Applications (en anglès). Merrill, gener 1992, p. 323. ISBN 978-0-02-381560-7. 
  4. Ian Griffiths. Programming C# 4.0: Building Windows, Web, and RIA Applications for the .NET 4.0 Framework (en anglès). "O'Reilly Media, Inc.", 30 juliol 2010, p. 81–. ISBN 978-1-4493-9972-6. 
  5. Michael A. Miller. The 68000 Microprocessor Family: Architecture, Programming, and Applications (en anglès). Merrill, gener 1992, p. 323. ISBN 978-0-02-381560-7. 
  6. Steve Oualline. Practical C Programming (en anglès). "O'Reilly Media, Inc.", 1997, p. 403–. ISBN 978-1-56592-306-5. 
  7. Tibet Mimar. Programming and Designing with the 68000 Family: Including 68000, 68010/12, 68020, and the 68030 (en anglès). Prentice Hall, 1991, p. 275. ISBN 978-0-13-731498-0. 
  8. Prata, Stephen. C primer plus (en anglès). 5th. Indianapolis, Ind: Sams, 2007. ISBN 978-0-672-32696-7. 
  9. Mark E. Daggett. Expert JavaScript (en anglès). Apress, 13 novembre 2013, p. 68–. ISBN 978-1-4302-6097-4. 
  10. Prata, Stephen. C primer plus. 5th. Indianapolis, Ind: Sams, 2007. ISBN 978-0-672-32696-7.