Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Propriedades Numéricas de Base 2 - Parte 2
Olá gente! Novamente, prometi e cumpri! Esses dias eu reservei um tempinho para pensar, analisar códigos binários, operações binárias, e cheguei a algumas conclusões! Sugiro que você comece lendo o tutorial original, que usa matemática decimal pura para pegar as propriedades, e quando achar que pegou o jeito, venha ler esse tutorial aqui, que com uma base em mente você já vai entender melhor como funciona! Irei começar dando uma breve introdução ao sistema binário, apenas o suficiente para entender o código no final. Boa sorte!
O Sistema Binário
Para quem não conhece, o sistema binário é um sistema numérico como o nosso decimal, que vai de 0 a 9, só que o binário só tem 0 e 1. Mesmo com essa limitação, qualquer número do nosso sistema decimal pode ser representado no sistema binário! Vamos começar aprendendo a converter de decimal para binário, e vice-versa?
Decimal para Binário
Para transformar um número decimal em binário, devemos ir dividindo o número por 2 até chegar no 0, anotando as sobras (se o número é par, a sobra é 0, se é ímpar, a sobra é 1 e o próximo número é arredondado para baixo). Depois, pegamos as sobras, e lemos elas de baixo para cima, obtendo portanto o número em binários. Vamos ver quanto é o número 10 em binários:
10 / 2 (sobra 0)
5 / 2 (sobra 1; 2,5 arredonda para 2)
2 / 2 (sobra 0)
1 / 2 (sobra 1; 0,5 arredonda para 0)
0 / 2 (sobra 0)
....
10 em binários então seria 1010. Ali no nosso cálculo daria 01010, mas como no nosso sistema decimal comum, um zero à esquerda não vale nada!
Binário para Decimal
Para converter de binários para decimal já é mais complicado. Primeiro, devemos inverter novamente a nossa sequência de números. Teremos 0101, agora devemos multiplicar cada um desses números por 2 na potência de sua posição, começando em 0. Complicado não? Com uma formulazinha fica mais fácil!
..10....invertido
1010 -> 0101
(2º 0) + (2¹ 1) + (2² 0) + (2³ 1);
Fazendo os cálculos, descartando o que é multiplicado por zero já que multiplicar por zero resulta em zero...
(2º 0) + (2¹ 1) + (2² 0) + (2³ 1);
2 + 8 = 10
Viu que legalzinho??
Tabelinha
Bom gente, antes de continuarmos, vamos montar uma tabelinha com os números que usaremos (ou não) posteriormente, com sua representação decimal e binária.
Decimal - Binário
1.........0001
2.........0010
3.........0011
4.........0100
5.........0101
6.........0110
7.........0111
8.........1000
9.........1001
10........1010
11........1011
12........1100
13........1101
14........1110
15........1111
Acho que isso já é o suficiente!
Operações binárias
Não vou explicar todas as operações binárias, adição, multiplicação, blábláblá, mimimi... e sim o que usaremos aqui.
Vamos ver os operadores OR, XOR e AND. Os operadores são |, ^ e &, não vá confundir com os operadores boolean!
Bom vamos, estudar cada um desses operadores, usando como exemplos, os números 6 e 10, ou seja, 0110 e 1010.
OR
O operador OR irá comparar dois números binários, botando no resultado 1 caso qualquer um dos números possua 1 nessa posição, ou 0 se ambos possuem 0 na posição. Vamos comparar 6 e 10:
..0 1 1 0
|.1 0 1 0
---------
..1 1 1 0
No caso, 6|10 = 14.
XOR
O operador XOR faz a mesma coisa, mas ele apenas bota no resultado 1 caso apenas um dos números possua 1 nessa posição. Se nessa posição ambos possuirem 0 ou 1, no resultado é colocado 0. Veja:
..0 1 1 0
^.1 0 1 0
---------
..1 1 0 0
No caso, 6^10 = 12.
AND
O operador AND apenas põe 1 no resultado caso ambos os números tiverem 1 nessa posição. Caso contrário, vai 0. Veja o exemplo:
..0 1 1 0
&.1 0 1 0
---------
..0 0 1 0
No caso, 6&10 = 2.
E as propriedades tio?
Bom gente, as propriedades continuam sendo potências de 2. Só que agora vamos estudar o que acontece com cada uma delas:
1 - 0001
2 - 0010
4 - 0100
8 - 1000
Como agente pode ver, elas tem espaço para adicionar umas as outras:
1+2 = 3
01 + 10 = 11
01 | 10 = 11
01 ^ 10 = 11
Como podemos ver, na hora de combinar propriedades, podemos usar qualquer um dos seguintes operadores: |, ^ e +.
Então, e se eu quiser descobrir quais propriedades estão presentes em um número? Simples, comparamos uma determinada propriedade e um número, através do operador AND. Como veremos a seguir, se o número possui a propriedade, o resultado é a propriedade, caso contrário, o resultado é 0.
1000 & 1100 = 1000
10 & 1101 = 0
1 & 1101 = 1
100 & 111 = 100
Portanto, quem já teve alguma idéia de como fica o código, muito bom!
O código
Gente, hoje o código é em C++!!! Vamos um exemplozinho para você ter uma idéia, uma espécie de sisteminha de chamada em DOS:
#include <stdio.h>
#define JOAO 1
#define JOSE 2
#define JOAQUIM 4
#define MARCOS 8
#define MARIO 16
int resposta = 0;
void quemEstaPresente(int quem)
{
if(quem & JOAO)
{
printf("Joao esta presente.\n");
}
if(quem & JOSE)
{
printf("Jose esta presente.\n");
}
if(quem & JOAQUIM)
{
printf("Joaquim esta presente.\n");
}
if(quem & MARCOS)
{
printf("Marcos esta presente.\n");
}
if(quem & MARIO)
{
printf("Mario esta presente.\n");
}
}
int main()
{
do{
printf("Digite o numero que quer.\n");
scanf("%d", &resposta);
printf("\n");
quemEstaPresente(resposta);
} while(resposta != 0);
return 0;
}