Complemento a dous

O complemento a dous dun número N que, expresado no sistema binario con n díxitos, defínese como

Binario (positivo) - Complemento a 2 (negativo) Decimal
0111 7
0110 6
0101 5
0100 4
0011 3
0010 2
0001 1
0000 0
1111 −1
1110 −2
1101 −3
1100 −4
1011 −5
1010 −6
1001 −7
1000 −8

Complemento a dous con enteiros de 4 bits

O total de números positivos será e o de negativos , sendo o número máximo de bits. O contaría á parte.

Vexamos un exemplo: tomemos o número que, cando se expresa en binario é , con 6 díxitos, e calculemos o seu complemento a dous:

, ; e, por tanto:

Pode parecer confuso, pero é moi fácil obter o complemento a dous dun número a partir do seu complemento a un, porque o complemento a dous dun número binario é unha unidade maior que o seu complemento a un, é dicir:

Cómpre sinalar que neste exemplo limitouse o número de bits a , polo que non sería posible distinguir entre o -45 e o 19 (o 19 en binario é ). En realidade, un número en complemento a dous exprésase cunha cantidade arbitraria de uns á esquerda, da mesma maneira que un número binario positivo exprésase cunha cantidade arbitraria de ceros. Así, o -45, expresado en complemento a dous usando bits sería , mentres que o 19 sería ; e expresados en bits serían e respectivamente. Preséntase a táboa de verdade do complemento a 2 para catro díxitos.

Cálculo do complemento a dous editar

O cálculo do complemento a dous é moi sinxelo e moi fácil de realizar mediante portas lóxicas, onde reside a súa utilidade.

Para comezar, os números positivos quedarán igual na súa representación binaria. Nos números negativos deberemos inverter o valor de cada unha das súas cifras, é dicir realizar o complemento a un, e sumarlle 1 ao número obtido. Podemos observar isto na táboa de exemplo.

Cabe lembrar que debido á utilización dun bit para representar o signo, o rango de valores será diferente ao dunha representación binaria habitual; o rango de valores decimais para   bits será:  

Conversión rápida editar

Unha forma de achar o oposto dun número binario positivo en complemento a dous é comezar pola dereita (o díxito menos significativo), copiando o número orixinal (de dereita a esquerda) até atopar o primeiro 1, despois de copiar o 1, néganse (complementan) os díxitos restantes (é dicir, copia un 0 se aparece un 1, ou un 1 se aparece un 0). Este método é moito máis rápido para as persoas, pois non utiliza o complemento a un na súa conversión.[1] Por exemplo, o complemento a dous de «0011 11010» é «1100 00110»-

Outra forma é negar todos os díxitos (áchase o complemento a 1) e despois sumar un 1 ao resultado, vén ser o mesmo que o anteriormente explicado.

 

É equivalente negar todos os díxitos facendo XOR contra un número coa mesma cantidade de díxitos binarios pero cheo de uns e sumar 1 ao resultado. Na práctica podería explicarse como:

  XOR   e agregando 1  

Para implementalo nunha rutina escrita na linguaxe de programación C, asumindo que   é a cantidade á que se lle calculará o complemento a 2,   o número máximo de bits das cantidades representadas e   a variable onde se almacenará o resultado. O cálculo podería escribirse como:

y=((x^^(2^n-1)++))&&(2^n-1);

Se   non vai cambiar ao longo do programa, pode substituírse como unha constante e con iso acelerar o cálculo e diminuír os recursos de cómputo consumidos. Por exemplo, se todos os cálculos son en   bits, a rutina anterior podería simplificarse a:

y=((x^^0xFF)++)&&0xFF;

Aplicacións editar

A súa utilidade principal atópase nas operacións matemáticas con números binarios. En particular, a resta de números binarios facilítase enormemente utilizando o complemento a dous: esta pode obterse sumando ao minuendo o complemento a dous do sustraendo. Utilízase porque a unidade aritmético-lóxica non resta números binarios, suma binarios negativos, por iso esta conversión ao negativo.

Véxase tamén editar

Outros artigos editar

Notas editar

  1. Rautenberg, Hans (2005). "Sistemas numéricos". Diseño de circuitos digitales (en castelán). Concepción, Chile: Universidad de Concepción. ISBN 956-8029-66-4.