A soma binária

Operações aritméticas? Mas ainda só falámos de portas lógicas com respostas verdadeiro ou falso. Como é que isso vai produzir somas, subtrações, multiplicações e divisões? Como é que é possível conseguir isso, utilizando combinações de portas lógicas em circuitos lógicos,  que refletem expressões da Lógica proposicional que só respondem verdadeiro ou falso?
Realmente, só com verdadeiro ou falso como entradas e saídas nos circuitos, não se consegue entender como se fazem somas de números tal como nós os conhecemos e tratamos, em representação decimal. Enquanto pensarmos como tal, em decimal.
Mas no sistema numérico binário, talvez já não seja tão difícil de entender. Basta pensarmos que verdadeiro e falso se refletem em 1 e 0. Ora, como não há quaisquer outros números nesta base numérica, qualquer operação que envolva estes números só pode devolver 1 ou 0. E isso é precisamente o que fazem as portas lógicas.
Portanto, mais uma vez estamos a ser remetidos para uma questão de raciocínio lógico que conduza a combinações devidas dessas portas, para obter um objetivo. Vamos começar com o objetivo de somar, a origem de todas as outras operações.
Mas para isso temos que aprender de novo a somar, isto é, vamos ter que decompor passo a passo aquilo que fazemos intuitivamente desde os primeiros anos de escola, para podermos determinar o algoritmo da soma. E agora vamos ter que o fazer com números binários, ou na base 2, começando por o fazer da forma mais intuitiva, tal como na escola, a papel e lápis, considerando exatamente os mesmos passos que aprendemos para a base 10.

Fig-3-1

Figura 1

Comecemos por somar dois números na base 10, a papel e lápis, sem máquina de calcular. Somemos por exemplo o número 76.354 com o número 32.377, acompanhando desde já com o desenvolvimento do algoritmo dessa soma.

  1. Colocam-se os dois números um por cima do outro, casa a casa e ambos encostados à direita.
  2. Somam-se os dígitos de cada casa a partir da direita para a esquerda.
  3. Somam-se os dígitos da primeira coluna e inscreve-se ma mesma coluna por baixo.
  4. Se o resultado da soma for superior a 9 coloca-se na mesma coluna por baixo o algarismo à direita do 1 e acrescenta-se o 1 por cima da coluna seguinte. Chamamos a isto o “vai 1”.
  5. Se não há mais colunas salta para o passo 7.
  6. Se há mais colunas volta-se ao passo 3.
  7. Se Vem 1 coloca-se na coluna à esquerda do resultado. A soma está concluída

Este é o algoritmo da soma na base 10. O algoritmo de soma na base 2 é exatamente o mesmo, com a diferença de que temos só dois dígitos, 0 e 1

0 + 0 = 0, 1 + 0 = 1, 0 + 1 =  1 1 + 1  = 2

Alto! Mas 2 não existe na base 2. Tal como 10 não existe na base 10 como dígito.
A base representa o número de  dígitos usados para representar números nessa  base. Dez (0 a 9) na base 10, dois (0 a 1) na base 2 e dezasseis (0 a F) na base 16.
Dez (10) é o nome que damos na base decimal ao primeiro número para além dos algarismos da base, número esse a que na base 2 vamos chamar  um/zero (10).
De cada vez que se esgotam os dígitos que representam números numa base, pomos um 1 à esquerda e recomeçamos a contagem.

  • Em decimal depois de 9 vem 10, depois de 99 vem 100, depois de 999 vem 1000, e assim por diante.
  • Em binário depois de 1 vem 10, depois de 11 vem 100, depois de 111 vem 1000 e assim por diante.
  • Em hexadecimal depois de F vem 10, depois de FF vem 100, depois de FFF vem 1000 e assim por diante.

Portanto, a partir de agora vamos deixar de pronunciar  10 como dez para passarmos a pronunciar como um/zero, 100 não como cem mas como um/zero/zero e assim por diante. Desta forma estaremos a usar a mesma designação para um número com o mesmo significado em todas as bases de numeração.
Assim sendo, quando somamos 1 com 1 na base 2 temos como resultado 10 (um/zero). Colocamos o 0 como resultado dessa coluna e vai 1 no topo da coluna à esquerda. Vamos experimentar e somar 1011 com 1011, seguindo passo a passo o algoritmo atrás enunciado. Podemos verificar este algoritmo representado em gráficos para a base 10 e para a base 2 na Figura 1.

Mas o computador não sabe somar assim. Ele não andou connosco na escola em pequenino e a velha mestra não lhe ensinou as regras e mnemónicas que utilizamos nas somas. Ele é teimoso e burro e continua a insistir em só conhecer 0 e 1. Diz que lhe basta. E olhem que até tem razão, como vamos ver. Só que assim dá-nos um trabalhão para lhe ensinarmos o que queremos que ele faça.
Temos então que, uma vez levada à essência a forma como resolvemos o problema no mundo real (determinado o algoritmo do problema), montar um bom raciocínio lógico temperado com um pouco de imaginação, que nos permita encontrar nas propriedades das portas lógicas, a resposta à nossa questão.
Estamos a somar na base 2. Os operandos só podem ser números compostos por 0 ou 1, tal como as entradas das portas lógicas. E o resultado é sempre expresso em 0 ou 1, tal como as saídas das portas lógicas. Talvez esta constatação nos torne mais clara a possibilidade de encontrarmos a solução com combinações de portas lógicas.

Circuito Somador Parcial

Circuito de soma parcial

Figura 2

Relembramos agora ter dito há pouco que na base dois

0 + 0 = 0, 1 + 0 = 1, 0 + 1 =  1 1 + 1  = 0 e vai 1

Ao revermos agora essa afirmação lembramo-nos da propriedade de uma porta lógica que responde sempre um dos dois mas não ambos, que é a disjunção exclusiva, ou eXclusiv OR ou XOR.
Nas três primeiras hipóteses de soma (0+0=0, 0+1=1, 1+0=1) a resposta está certa. A porta XOR retorna na sua saída exatamente o valor correspondente ao resultado da soma.
Na última (1+1=0 e vai 1) também está certa no dígito que fica nessa coluna, mas sobra a questão do vai 1. E a porta XOR não adivinha se vai ou não vai. Ela só sabe que se forem iguais a resposta é 0. Se forem diferentes a resposta é 1. Acompanhem com a Figura 2.
Partindo do principio que a solução pode passar pela utilização da porta XOR, continuemos então a pensar como podemos resolver a questão do vai 1. Ora, o vai 1 só se dá exclusivamente na situação em que A0 e B0 são 1. Nas restantes opções não vai nada. Fica-se por ali. Então, a resposta pretendida cai nas propriedades de uma porta AND. Basta pôr essa porta a analisar os mesmos dados em paralelo com a porta XOR.
Temos assim encontrada a composição para o circuito somador parcial ou do bit de ordem 0, em que o resultado da soma desses bits se encontra nas saídas S0 e C0.

Mas porquê parcial?

Recordemos que neste circuito existe o conceito do “vai um”. Ora a admissão da existência de um vai 1 implica que nos circuitos somadores dos bits de ordem seguinte tenha que ser considerado também o conceito do “vem um”. A esse circuito chamaremos circuito somador completo e vamos abordá-lo já de seguida.

Mas antes de prosseguirmos vamos ter que fazer uma referência clarificadora dos  vai 1 e vem 1.

Carry Out e Carry In

Esta designação escolar do vai um e do vem um assume em linguagem informática a designação de carry out ou carry in.
Na realidade o vai um e o vem um só são referidos quando na realidade vai ou vem mesmo 1. Mas em termos informáticos e nos circuitos lógicos temos que considerar sempre a possibilidade de existência desse valor, seja 1 ou 0 e isto de estar a dizer que vai um ou vem um quando não vai nem vem nada, não bate certo.
Portanto os termos ingleses de carry in (transporta para dentro) ou carry out (transporta para fora) estão mais corretos no seu significado e por isso vamos adotá-los, sendo que:

  •  Carry Out (Co)  é o valor que não cabe na representação da ordem de bits a ser somada e que é transportado para a soma dos bits de ordem imediatamente superior.
  • Carry In (Ci) é o valor que não cabe na representação da ordem de bits imediatamente anterior e que é transportado para a soma dos bits a ser somada.

No próximo artigo analisaremos o Circuito somador completo.

Deixar uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>