Murilo :P

C++, Computação, Programação, Web e afins :)

Fazendo contas de adição utilizando apenas operadores lógicos

leave a comment »

Um dia desses na comunidade C/C++ Brasil orkut, ví um tópico com o título de “Operadores lógicos” e eu, como estou em pleno semestre de Sistemas Digitais e Linguagens de Montagem, fiquei curioso para saber o que era.

No tópico o cara dizia que precisava fazer uma adição de dois números mas teria que ser apenas com operadores lógicos.

Minha resposta foi a seguinte:

Por exemplo
1 + 3 = 4

0001b +
0011b
____0

1 + 1 = 0 vai um

___1 < vai um da soma dos bits anteriores
0001b +
0011b
___00

1 + 0 + 1 = 0 vai um

__11 < vai um da soma dos bits anteriores
0001b +
0011b
_100

1 + 0 + 0 = 1 vai nada

__11 < vai um da soma dos bits anteriores
0001b +
0011b
0100

1 + 0 + 0 = 1 vai nada

Fazendo a conta:

Sendo que r = resultado e o c é o “vai um” da adição.

bit 0:
r0 = 1 ^ 1 = 0
c0 = 1 & 1 = 1
quer dizer:
1 + 1 = 0 e vai um

bit 1:
r1 = 0 ^ 1 = 1
r1 ^ c0 = 1 ^ 1 = 0
c1 = 1 & 1 = 1
quer dizer:
1 + 0 = 1
mais o vai um da adição dos bits anteriores
1 + 1 = 0 e vai 1

bit 2
r2 = 1 ^ 0 = 1
c2 = 1 & 0 = 0
quer dizer
1 + 0 = 1 vai nada

resultado:
0100b = 4

Não muito satisfeito com apenas a resposta teórica, resolvi colocar em prática.

#include <bitset>
#include <iostream>
using namespace std;
int main()
{

bitset<4> a(10); //primeiro número: 10
bitset<4> b(3); //segundo número: 3
bitset<5> s(0); //soma dos dois números
bitset<1> c(0); //carry ou vai-um

for (int j = 0; j < a.size(); j++) {

s[j] = (a[j] ^ b[j]) ^ c[0];
c[0] = (c[0]) ? a[j] | b[j] : a[j] & b[j];

}
s[4] = c[0];

cout << “O resultado: ” << s.to_ulong() << endl; //13

}

Esse algoritmo efetua a soma de dois números positivos de 4 bits [ou 1 nibble (0 a 15 decimal)].

Em breve colocarei também outras operações envolvendo apenas operadores lógicos.
Até mais =]

About these ads

Written by Murilo Adriano

26 de September de 2007 at 14:39

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 577 other followers

%d bloggers like this: