Complemento a dous

O complemento a dous dun número N que, expresado no sistema binario con n díxitos, defínese como C 2 N
2 n − N {\displaystyle C_{2}^{N}
2^{n}-N} O total de números positivos será 2 n − 1 − 1 {\displaystyle 2^{n-1}-1} e o de negativos 2 n − 1 {\displaystyle 2^{n-1}}, sendo n {\displaystyle n} o número máximo de bits. O 0 {\displaystyle 0} contaría á parte.
Vexamos un exemplo: tomemos o número que, cando se expresa en binario é N
45 {\displaystyle N
45}, con 6 díxitos, e calculemos o seu complemento a dous: N
1011012 {\displaystyle N
101101_{2}} N
45 {\displaystyle N
45}, n
6 {\displaystyle n
6}; 26
64 {\displaystyle 2^{6}
64} e, por tanto: C 2 N
64 − 45
0100112 {\displaystyle C_{2}^{N}
64-45
010011_{2}} 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 2 N
C 1 N + 1 {\displaystyle C_{2}^{N}
C_{1}^{N}+1} Cómpre sinalar que neste exemplo limitouse o número de bits a 6 {\displaystyle 6}, polo que non sería posible distinguir entre o -45 e o 19 (o 19 en binario é 10011 {\displaystyle 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 {\displaystyle 8} bits sería 11010011 {\displaystyle 11010011}, mentres que o 19 sería 00010011 {\displaystyle 00010011}; e expresados en 16 {\displaystyle 16} bits serían 1111111111010011 {\displaystyle 1111111111010011} e 0000000000010011 {\displaystyle 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 {\displaystyle n} bits será: − 2 n − 1 ≤ R a n g o ≤ 2 n − 1 − 1 {\displaystyle -2^{n-1}\leq \ Rango\leq \ 2^{n-1}-1} 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. Por exemplo, o complemento a dous de «001111010» é «110000110»-
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 {\displaystyle 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 {\displaystyle 100001} XOR 111111
011110 {\displaystyle 111111
011110} e agregando 1
011111 {\displaystyle
011111} Para implementalo nunha rutina escrita na linguaxe de programación C, asumindo que x {\displaystyle x} é a cantidade á que se lle calculará o complemento a 2, n {\displaystyle n} o número máximo de bits das cantidades representadas e e {\displaystyle 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 {\displaystyle 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 {\displaystyle 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.