Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

José Enésio

[Resolvido] [Tutorial] Propriedades Base 2

Recommended Posts

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;
}

Espero que tenham gostado! Até a próxima pessoal!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.