Operació bit a bit: diferència entre les revisions

Contingut suprimit Contingut afegit
m robot estandarditzant mida de les imatges, localitzant i simplificant codi
m Bot: Replace deprecated <source> tag and "enclose" parameter; canvis superficials
Línia 2:
 
== Tipus d'operacions ==
Es poden distingir fins a tres tipus diferents d'operacions a nivell de bit:
 
# Operacions ''bit a bit'': Executen les operacions lògiques AND, OR, XOR, NOT, etc., sobre els bits individuals dels operands.
Línia 8:
# Operacions de ''rotació'': Roten els bits de l'operand cap a la dreta o cap a l'esquerra una o més posicions. Es pot, o no, usar el flag de [[ròssec (Aritmètica)|ròssec]] com un bit addicional en la rotació.
 
== Operacions bit a bit ==
=== NOT ===
El NOT bit a bit, o bitwise, o complement, és una [[operació unaria]] que realitza la [[negació lògica]] a cada bit, invertint els bits del nombre, de tal manera que els zeros es converteixen en 1 i viceversa. Per exemple:
Línia 20:
 
=== AND ===
El AND bit a bit, o bitwise, presa dos nombres enters i realitza l'operació [[Conjunció lògica | AND lògica]] a cada parell corresponent de bits. El resultat en cada posició és 1 si el bit corresponent dels dos operands és 1, i 0 en cas contrari, per exemple:
 
0101 (decimal 5)
Línia 29:
 
=== OR ===
Una operació OR de bit a bit, o bitwise, presa dos nombres enters i realitza l'operació [[Disjunció lògica | OR inclusiu]] a cada parell corresponent de bits. El resultat en cada posició és 1 si el bit corresponent d'una dels dos operands és 1, i 0 si tots dos bits són 0, per exemple:
 
0101
Línia 37:
=== XOR ===
 
El XOR bit a bit, o bitwise, presa dos nombres enters i realitza l'operació [[Disjunció exclusiva | OR exclusiu]] a cada parell corresponent de bits. El resultat en cada posició és 1 si el parell de bits són diferents i zero si el parell de bits són iguals.
 
0101
Línia 52:
 
=== Desplaçaments de bits ===
Els desplaçaments de bit (bitshifts) són de vegades considerats operacions bit a bit, perquè operen en la representació binària d'un nombre enter en lloc de sobre el seu valor numèric, però, els desplaçaments de bits no operen en parells de bits corresponents, i per tant no poden ser anomenats pròpiament com "bit a bit" (bit d'adreça). En aquestes operacions els dígits (bits) són moguts, o desplaçats, cap a l'esquerra o cap a la dreta. Els [[Registre (maquinari) | registres]] en un processador d'ordinador tenen una amplada fixa, així que alguns bits "seran desplaçats cap a fora" ("shifted out"), és a dir, "surten" del registre per un extrem, mentre que el mateix nombre de bits són "desplaçats cap a dintre" ("shifted in"), és a dir, "entren" per l'altre extrem, les diferències entre els operadors de desplaçament de bits estan en com aquests determinen els valors dels bits que entren al registre (desplaçament cap a dins) (shifted-in).
 
==== Desplaçament lògic ====
Línia 91:
 
===== Multiplicació i divisió per 2<sup>n</sup>, d'enters sense signe =====
En [[nombre enter | nombres enters]] sense signe, el desplaçament lògic cap a l'esquerra equival a una multiplicació per 2 i el desplaçament lògic cap a la dreta equival a una divisió per 2. A la divisió (desplaçament cap a la dreta), es perd el bit menys significatiu, donant com a resultat un truncament del resultat (arrodoniment cap avall, cap a menys infinit). Així, 6/2 és igual a 3, però 7/2 és igual a 3,5, però el 0,5 es perd quedant el resultat en 3.
 
Els programadors de llenguatge assemblador usen aquesta propietat per fer multiplicacions i divisions ràpides, d'enters sense signe, per una potència de 2, on n desplaçaments equivalen a multiplicar o dividir per 2<sup>n</sup>. També, si el processador no té operacions de multiplicació i divisió d'enters, o si aquestes són molt lentes, es pot multiplicar o dividir usant desplaçaments i sumes per multiplicar i desplaçaments i restes per dividir. Per exemple, per multiplicar un enter per 10, es procedeix de la manera següent (en el llenguatge assemblador del x86):
Línia 99:
En les instruccions de sota, EAX i EBX són registres del processador, SHL (shift left), desplaça el registre indicat una posició (un bit) cap a l'esquerra (que equival a multiplicar per 2), MOV copia el registre de la dreta sobre el registre de l'esquerra, i ADD afegeix el registre de la dreta al registre de l'esquerra.
 
<sourcesyntaxhighlight lang="asm">
SHL EAX, 1; EAX = EAX * 2 EAX = 2n, desplaça a l'esquerra el contingut del registre EAX una posició,
                                               ; (Multiplica EAX per 2)
Línia 107:
ADD EAX, EBX; EAX = EAX + EBX EAX = 2n + 8n = 10n; suma EBX (8n) a EAX (2n),
                                                         ; (Ara EAX té el valor original multiplicat per 10)
</syntaxhighlight>
</source>
 
==== Desplaçament aritmètic ====
[[Fitxer: Rotate left logically.svg |miniatura| Desplaçament aritmètic cap a l'esquerra]]
[[Fitxer: Rotate right arithmetically.svg |miniatura| Desplaçament aritmètic cap a la dreta]]
Els desplaçaments aritmètics són similars als desplaçaments lògics, només que els aritmètics estan pensats per treballar sobre nombres enters amb signe en representació de [[complement a dos]] en lloc d'enters sense signe. Els desplaçaments aritmètics permeten la multiplicació i la divisió per dos, de nombres enters amb signe, per una potència de dos. Desplaçar n bits cap a l'esquerra o a la dreta equival a multiplicar o dividir per 2 <sup> n </sup>, (assumint que el valor no fa [[Desbordament aritmètic | desbordament]] (overflow o underflow)).
 
El desplaçament aritmètic a l'esquerra és exactament igual al desplaçament lògic cap a l'esquerra. De fet són dos noms diferents per exactament la mateixa operació. En desplaçar els bits una posició cap a l'esquerra és equivalent a una multiplicació per 2 independentment de si és un nombre enter amb signe o sense signe. En els processadors x86, el [[assemblador]] té dos pnemònics per al desplaçament lògic i l'aritmètic cap a l'esquerra, però quan el programa és ensamblat, només hi ha un opcode per tots dos a les instrucció en [[llenguatge de màquina]].
Línia 138:
[[Fitxer: Rotate left through carry.svg |miniatura| Rotació cap a l'esquerra a través del bit de ròssec]]
[[Fitxer: Rotate right through carry.svg |miniatura| Rotació cap a la dreta a través del bit de ròssec]]
== Operacions de Rotació ==
 
=== Rotació ===
Línia 150:
Si es fixa el flag del implico per endavant, una rotació simple a través del implico pot simular un desplaçament lògic o aritmètic d'una posició. Per exemple, si el flag del implico conté 0, després d'una rotació cap a la dreta a través del flag de l'implico, equival a un desplaçament lògic cap a la dreta, i si el flag del ròssec conté una còpia del bit del signe, equival a un desplaçament aritmètic cap a la dreta. Per això, alguns microcontroladors com ara els [[PIC (microcontrolador)|PIC]] només tenen les funcions de girar i girar a través de l'implico, i no es preocupen de tenir instruccions de desplaçament aritmètic o lògic.
 
Rotar a través del implico és especialment útil quan es fan desplaçaments en nombres més grans que la mida natiu de la [[Paraula (informàtica) | paraula]] del processador, perquè si, per ara, un nombre gran és emmagatzemat en dos registres i es vol desplaçar cap a la dreta un bit, el bit que surt de l'extrem dret del registre de l'esquerra ha d'entrar per l'extrem esquerre del registre de la dreta. Amb rotació a través del implico, aquest bit és "emmagatzemat" al flag de l'implico durant el primer desplaçament cap a la dreta sobre el registre de l'esquerra, a punt per ser desplaçat al registre de la dreta usant una simple rotació amb implico cap a la dreta i sense utilitzar cap preparació extra.
 
== Vegeu també ==