Complemento a dous

De testwiki
Saltar á navegación Saltar á procura
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 complemento a dous dun número N que, expresado no sistema binario con n díxitos, defínese como

C2N=2nN

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

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

N=45, n=6; 26=64 e, por tanto: C2N=6445=0100112

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:

C2N=C1N+1

Cómpre sinalar que neste exemplo limitouse o número de bits a 6, polo que non sería posible distinguir entre o -45 e o 19 (o 19 en binario é 10011). 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 8 bits sería 11010011, mentres que o 19 sería 00010011; e expresados en 16 bits serían 1111111111010011 e 0000000000010011 respectivamente. Preséntase a táboa de verdade do complemento a 2 para catro díxitos.

Cálculo do complemento a dous

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 n bits será: 2n1 Rango 2n11

Conversión rápida

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.

100001>011110>011111

É 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:

100001 XOR 111111=011110 e agregando 1 =011111

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

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

Se n 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 8 bits, a rutina anterior podería simplificarse a:

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

Aplicacións

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

Outros artigos

Notas

Modelo:Listaref

Modelo:Control de autoridades