Diferència entre revisions de la pàgina «Operació bit a bit»

1.437 octets eliminats ,  fa 7 anys
Retiro informació sense referències
m (Bot: Traient 16 enllaços interwiki, ara proporcionats per Wikidata a d:Q879126)
(Retiro informació sense referències)
Una '''operació bit a bit''' (en anglès ''bitwise operation'') opera sobre [[nombre binari|nombres binaris]] a nivell dels seus [[bit]]s individuals. És una acció primitiva ràpida i és suportada directament pels [[CPU | processador]]. En processadors simples de baix cost, les operacions de bit a bit, juntament amb els d'addició i subtracció, són substancialment més ràpides que la multiplicació i la divisió, mentre que en els moderns processadors d'alt rendiment usualment les operacions es realitzen a la mateixa velocitat.
 
== Tipus d'operacions ==
 
Es poden distingir fins a tres tipus diferents d'operacions a nivell de bit:
 
 
==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:
 
=== 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:
 
 
== Operacions de desplaçament ==
 
Les operacions de desplaçament i rotació són:
 
 
=== 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 ====
 
[[Image: Rotate left logically.svg | thumb | right | Desplaçament lògic cap a l'esquerra]]
[[Image: Rotate right logically.svg | thumb | right | Desplaçament lògic cap a la dreta]]
 
===== Movent bits =====
 
El desplaçament lògic s'usa per moure bits cap a l'esquerra o cap a la dreta per col · locar en la posició adequada.
 
 
===== 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.
 
 
==== Desplaçament aritmètic ====
 
[[Image: Rotate left logically.svg | thumb | Desplaçament aritmètic cap a l'esquerra]]
[[Image: Rotate right arithmetically.svg | thumb | 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 oao 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ónicospnemònics per al desplaçament lògic i el 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]].
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 oa 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ónicos per al desplaçament lògic i el 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]].
 
El desplaçament aritmètic cap a la dreta és diferent al desplaçament lògic cap a la dreta. En els sencers sense signe, per dividir per 2, s'ha d'usar el desplaçament lògic, el qual sempre afegeix un 0 a l'extrem esquerre per cada desplaçament d'un bit a la dreta. En canvi, en els enters amb signe, s'ha d'usar el desplaçament aritmètic cap a la dreta, el qual copia el bit del signe (el [[bit més significatiu]] (MSB)) en l'espai buit que queda a l'extrem esquerre cada vegada que es fa un desplaçament d'un bit a la dreta. D'aquesta manera, es divideix efectivament per 2 a l'enter amb signe.
==== Rotació mitjançant el bit de ròssec ====
 
Rotar a través del bit de l'implico és similar a l'operació de girar anterior (rotació sense implico). La diferència està en que els dos extrems del registre estan units entre si a través del [[Ròssec (Aritmètica)| flag de ròssec]], el qual queda enmig d'ells. El bit que surt per un extrem va al flag del implico, i el bit original que estava en el flag de l'implico entra al registre per l'extrem oposat.
 
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 rotar 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.
 
==Aplicacions ==
Les operacions bit a bit són necessàries sobretot en el baix nivell de programació com els controladors de dispositius d'escriptura, gràfics de baix nivell, les comunicacions de muntatge paquet de protocol i descodificació. Encara que les màquines sovint tenen eficient incorporat a les instruccions per realitzar operacions aritmètiques i lògiques, de fet, totes aquestes operacions es poden realitzar mitjançant la combinació dels operadors de bits i zero de proves de diverses maneres.{{cita requerida | data = novembre de 2012}}
 
Per exemple, aquí hi ha un [[pseudocodi]] d'exemple que mostra com multiplicar dos nombres enters arbitraris <code> a </code> i <code> b </code> (essent <code> a </code> més gran que b </code>) utilitzant només bitshifts i l'addició:
 
<code>
c := 0
'''while''' b ≠ 0
'''if''' (b '''and''' 1) ≠ 0
c := c + a
left shift a by 1
right shift b by 1
'''return''' c
</code>
 
Aquesta implementació de multiplicació de l'[[Antic Egipte]], com la majoria de algorismes de [[multiplicació]], implica bitshifts. Al seu torn, fins i tot més es poden escriure amb només bitshifts i zero proves-{{cita requerida | data = novembre de 2012}}:
 
<code>
c := b '''and''' a
'''while''' a ≠ 0
c := b '''and''' a
b := b '''xor''' a
left shift c by 1
a := c
'''return''' b
</code>
 
== Vegeu també ==
 
* [[Conjunció lògica]]
* [[Disjunció lògica]]
* [[Àlgebra de Boole]]
 
{{ORDENA:Operacio Bit A Bit}} <!--ORDENA generat per bot-->
 
{{ORDENA:Operacio Bit A Bit}} <!--ORDENA generat per bot-->
[[Categoria:Informàtica]]
[[Categoria:Aritmètica]]
104.889

modificacions