Anar al contingut

Operador a nivell de bits

De L'Enciclopèdia, la wikipedia en valencià

Una operació bit a bit o bitwise opera sobre número binario a nivell dels seus bits individuals. És una acció primitiva ràpida, soportada directament pels processadorés. En processadors simples de baix cost, les operacions de bit a bit, junt en els de adició i substracció, són típicament substancialment més ràpides que la multiplicació i la divisió, mentres que en els moderns processadors d'alt rendiment usualment les operacions es realisen casi a la mateixa velocitat.

Tipos d'operacions

[editar | editar còdic]
  1. Operacions bit a bit: Eixecuten les operacions llògiques AND, OR, XOR, NOT, etc, sobre els bits individuals dels operants.
  2. Operacions de desplaçament: Desplacen els bits dels operants cap a la dreta o cap a l'esquerra una o més posicions.
  3. Operacions de rotació: Rotan els bits de l'operant cap a la dreta o cap a l'esquerra una o més posicions. Poden usar o no el flag del carrege com un bit adicional en la rotació.

Operadors bit a bit

[editar | editar còdic]

En les explicacions d'avall, qualsevol indicació d'una posició d'un bit és contada de dreta a esquerra a partir del bit menys significatiu. Per eixemple, el valor binario 0001 (el decimal 1) té zeros en cada posició llevat en la primera.

A NOT A
0 1
1 0

El NOT bit a bit, o bitwise, o complement, és una operació unaria que realisa la negació llògica en cada bit, invertint els bits del número, de tal manera que els zeros es convertixen en 1 i viceversa. Per eixemple:

NOT 10011
  = 01100
  • El NOT forma el complement a un d'un valor binario dau.
  • En un número entero en signe en complement a dos, el NOT dona com resultat l'invers aditiu del número menys 1, és dir NOT x = -x - 1. Per a obtindre el complement a dos d'un número, es deu sumar 1 al resultat, donant el negatiu del número. Açò equival a un canvi de signe del número: +5 es convertix en -5, i -5 es convertix en +5.
  • Per als sancers sense signe, el complement bit a bit és la “reflexió d'espill” del número a través del punt mig del ranc del sancer. Per eixemple, per als sancers sense signe de 8 bits, NOT x = 255 - x, per als sancers sense signe de 16 bits, NOT x = 65535 - x, i en general, per als sancers sense signe de n bits, NOT x = (2n - 1) - x.
A B A AND B
0 0 0
0 1 0
1 0 0
1 1 1

El AND bit a bit, o bitwise, pren dos número entero i realisa l'operació AND llògica en cada parell corresponent de bits. El resultat en cada posició és 1 si el bit corresponent dels dos operants és 1, i 0 de lo contrari, per eixemple:

    0101
AND 0011
  = 0001

El AND pot ser usat per a filtrar determinats bits, permetent que uns bits passen i els atres no. També pot usar-se en sistemes de major fiabilitat.

Determinant l'estat de bits

[editar | editar còdic]

El AND pot ser usat per a determinar si un bit particular està encés (1) o apagat (0). Per eixemple, donat un patró de bits 0011, per a determinar si el segon bit està encés s'usa una operació AND en una caraça que conté encés solament el segon bit, que és el que es vol determinar:

    0011
AND 0010  (caraça)
  = 0010


ya que el resultat 0010 és diferent de zero, se sap que el segon bit en el patró original està encés. Açò és a sovint cridat emmaixquerament del bit (bit masking). (Per analogia, a l'us de les cintes d'emmaixquerar, que cobrixen o emmaixqueren porcions que no deuen ser alterades o porcions que no són d'interés. En este cas, els valors 0 emmaixqueren els bits que no són d'interés).

Extraent bits

[editar | editar còdic]

El AND es pot usar per a extraure determinats bits d'un valor. Si en un byte, per eixemple, tenim representats dos dígits hexadecimaels empaquetats, (un en els 4 bits superiors i l'atre en els 4 bits inferiors), podem extraure cada dígit hexadecimal usant el AND en les caraces adequades:

    0011 0101                    0011 0101
AND 1111 0000  (caraça)     AND 0000 1111  (caraça)
  = 0011 0000                  = 0000 0101
  Hex. superior                Hex. inferior

Apagant bits

[editar | editar còdic]

El AND també es pot usar per a apagar determinats bits. Solament cal posar una caraça en bits en zero en les posicions dels bits que es volen apagar i 1 en els demés bits. Tots els demés bits en la caraça 1 passaran inalterados, i els que tenen la caraça 0 s'apagaran. Donat l'eixemple 0111, el segon bit pot ser apagat usant un AND en el patró que té un zero en el segon bit i un 1 en el restant dels bits:

    0111
AND 1101  (caraça)
  = 0101
A B A OR B
0 0 0
0 1 1
1 0 1
1 1 1

Una operació OR de bit a bit, o bitwise, pren dos número entero i realisa l'operació OR inclusivo en cada parell corresponent de bits. El resultat en cada posició és 1 si el bit corresponent de qualsevol dels dos operants és 1, i 0 si abdós bits són 0, per eixemple:

   0101
OR 0011
 = 0111

Encenent bits

[editar | editar còdic]

El OR bit a bit, o bitwise, pot ser usat per a encendre un bit individual o un conjunt de bits. Per a això s'usa una caraça OR en els bits que es volen encendre en 1 i el restant dels bits en zero. El resultat serà que tots els bits originals quedaran com estaven llevat els bits en a on la caraça tinga 1, que resultaran encesos. Per eixemple, si en el patró de bits 0101 es vol encendre el segon bit es farà de la manera següent:

   0101
OR 0010  (caraça)
 = 0111

Copiant bits

[editar | editar còdic]

El OR, i el desplaçament llògic (explicat més alvance), pot ser usat per a copiar un grup de bits a una posició determinada.

Supongam que tenim el signe, l'exponent, i la part significativa d'un número, en diferents registres de 32 bits, i volem empaquetar-los per a formar un número en representació de punt flotant de simple precisió de 32 bits:

              Signe: 00000000000000000000000000000001
          Exponent: 00000000000000000000000010000011
Part significativa: 00000000011100000111000000001110

Tots ells tenen els valors correctes i tenim que moure cada u d'ells a la seua posició per a poder armar el punt flotant.

Es deu moure el signe 31 posicions cap a l'esquerra, l'exponent 23 posicions cap a l'esquerra, i la part significativa no és necessària moure-la perque ya està en la posició correcta. Estos desplaçaments es fan en l'operació de desplaçament cap a l'esquerra descrit més alvance:


Signe: 10000000000000000000000000000000 <-- Es desplaça el signe 31 posicions cap a l'esquerra

          Exponent: 01000001100000000000000000000000   <-- Es desplaça l'exponent 23 posicions cap a l'esquerra
Part significativa: 00000000011100000111000000001110   <-- La part significativa no es mou, ya està en el seu lloc

Ara que tenim cada part del número en el seu lloc, les combinem per a empaquetar-les i formar el número en la seua representació de punt flotant de 32 bits. Per a això usem el OR: (Resultat final) = (Signe) OR (Exponent) OR (Part significativa):

              Signe: 10000000000000000000000000000000
          Exponent: 01000001100000000000000000000000
Part significativa: 00000000011100000111000000001110
    Resultat final: 11000001111100000111000000001110

Ya tenim el número en la seua representació de punt flotant definitiva.

Procediment genèric per a copiar un grup de bits

[editar | editar còdic]

Per a copiar una série de bits en un lloc determinat usant OR, es necessita que eixe lloc a on es van a copiar tinga els seus bits en zero (per a fer un espai lliure per a poder copiar els bits). També es necessita que el registre a on es troben els bits que es volen copiar tinga els demés bits (els que no es volen copiar) apagats. Abdós operacions, aclarir els bits en el lloc del destí, i aclarir els bits que no es volen copiar es fan en AND:

Tenim dos registres de 16 bits:

Registre A: 1011 1100 0110 1100
Registre B: 1001 0001 1111 1010

Volem copiar els quatre bits menys significatius del registre A en el registre B.

Per a això, primer aclarim els 4 bits menys significatius de B en una operació AND, i aixina tindre un espai lliure:

            1001 0001 1111 1010   <-- Valor original del registre B
        AND 1111 1111 1111 0000   <-- Caraça per a aclarir els bits de B a on es van a copiar els que vénen de A
          = 1001 0001 1111 0000   <-- Registre B preparat per a rebre els 4 bits menys significatius de A

Després, aclarim els bits d'A que no volem copiar, deixant solament els bits que volem copiar:

            1011 1100 0110 1100   <-- Valor original del registre A AND
        0000 0000 0000 1111   <-- Caraça per a deixar solament els bits d'A que es volen copiar
          = 0000 0000 0000 1100   <-- Registre A en solament els bits que es desigen copiar

Ara estem llests per a fer el OR de sobre B i combinar els 4 bits menys significatius de sobre B:

            0000 0000 0000 1100   <-- Registre A en els 4 bits que es desigen copiar
         OR 1001 0001 1111 0000   <-- Registre B en un espai per als 4 bits que desigen copiar
          = 1001 0001 1111 1100   <-- Registre B en els 4 bits menys significatius de copiats sobre ell

Ara, el registre B té copiat els 4 bits menys significatius de A. El restant dels bits de B varen quedar intactes.

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

El XOR bit a bit, o bitwise, pren dos número entero i realisa l'operació OR exclusiu en 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. Per eixemple:

    0101
XOR 0011
  = 0110

Invertint bits selectivament

[editar | editar còdic]

A diferència de el NOT, que invertix tots els bits d'un registre, el XOR bit a bit, o bitwise, pot ser usat per a invertir selectivament un o més bits en un registre. Donat el patró de bits 0011, el segon i el quart bit poden ser invertits per XOR en una caraça en un patró de bits contenint 1 en les posicions que es volen invertir, la segona i quarta, i 0 en les demés. Els bits de les posicions en zero de la caraça resultaran inalterados:

    0011
XOR 1010  (caraça)
  = 1001

Igualtat i desigualtat de bits

[editar | editar còdic]

XOR és equivalent i té la mateixa taula de veres que la desigualtat, XOR i desigualtat són sinònims:

A B A XOR B A <> B
0 0 0 0
0 1 1 1
1 0 1 1
1 1 0 0

El XOR pot usar-se per a saber si els bits corresponents de dos operants són iguals o diferents. Per eixemple, si tenim dos operants, 1000 i 0010 i volem saber si els bits més significatius d'abdós són iguals procedim com seguix:

    1000
XOR 0010
  = 1010

Ara, cada bit del resultat estarà en 0 si el bit corresponent dels dos operants són iguals, i en 1 si són diferents. El bit més significatiu del resultat està en 1 indicant que són diferents, pero tenim que aïllar-ho dels demés en un AND per a poder usar-ho o prendre una decisió:

    1010  (resultat anterior)
AND 1000  (caraça per a aïllar el bit més significatiu)
  = 1000

Ara ho tenim aïllat en el resultat final, que és diferent de zero indicant que els bits més significatiu dels operants són diferents.

Assignar zero a un registre

[editar | editar còdic]

Els programadors alvançats de llenguage ensamblador usen XOR com una manera eficient i ràpida d'assignar zero a un registre. Realisar XOR d'un valor contra sí mateixa sempre resulta en zero (A XOR A sempre és zero), i en moltes arquitectura esta operació requerix menys cicles de rellonge i/o memòria que carregar un valor zero a un registre (A = 0).

En resum

[editar | editar còdic]

Les operacions bit a bit, o bitwise, poden encendre, apagar, deixar passar, eliminar, o invertir, bits individualment o en conjunt, usant la caraça adequada en un OR, AND, o XOR:

   0011                 1011                 10101                 10101                 1010
OR 1000 (caraça)   AND 1110 (caraça)   AND 00111 (caraça)   AND 11000 (caraça)   XOR 1001 (caraça)
 = 1011               = 1010               = 00101               = 10000               = 0011
Encén l'Apaga         el             Deixa passar els      3 Elimina els         3 Invertix els bits
bit superior        bit inferior         bits inferiors       bits inferiors
                                                               inferior i superior

NOT invertix els bits i XOR junt en AND permeten determinar si dos operants tenen els bits d'una determinada posició iguals o diferents:

NOT 1011              11010
  = 0100          XOR 10100

invertix tots = 01110 (0 = bit iguals, 1 = bits diferents)

els bits          AND 00010  (es filtra el segon bits, que és el que interessa)
                    = 00010
                  Determina si els bits de la segona posició
                  dels dos operants són iguals o diferents
                      0 = iguals
                      1 = diferents

Vore també

[editar | editar còdic]