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
Pois é gente, não sei a melhor maneira de descrever isso, mas bem, é tipo sabe aquelas propriedades que às vezes tu ve em códigos, que a primeira vale 1, a segunda vale 2, a terceira vale 4, a quarta vale 8, e assim vai indo, e você vai adicionando elas para obter propriedades compostas? Pois é, hoje vou ensinar a fazer exatamente isso: montar um sisteminha que é capaz de interpretar um número em propriedades. O que você fará com isso, é com você, mas lá vai. Antes de querer passar algum código, terei que ensinar a vocês a lógica por trás disso tudo! Essa lógica, descobri um dia desses. Peguei um caderno, um lápis, uma borracha, e fui observando as regras quanto às propriedades. É interessante que vocês tentem fazer algo assim quando não sabem o que fazer! Dá certo! Bom vamos lá!
As Regras
Para entender um sistema matemático complexo, é necessário conhecer as regras. Mas depois que você ver isso aqui, verá que não é tão complexo. É bem simples. Bom, vamos entender as regras primeiro!
Veja só as propriedades:
Prop1 = 1
Prop2 = 2
Prop3 = 4
Prop4 = 8
Prop5 = 16
Prop6 = 32
Como pode-se perceber, essas propriedades são potências de 2. Elas deixam um espaço entre si que permite adicionar as propriedades anteriores em qualquer combinação. Exemplo: Prop1 + Prop2 = 3, portanto 3 é a combinação das duas primeiras propriedades, já 6 é Prop3 + Prop2, ou seja, 4+2, o que quer dizer que é as duas propriedades ao mesmo tempo.
Sabendo disso, podemos descobrir qual é a última propriedade: o número dado dividido pela propriedade maior resulta em um número entre 1 e 2. Teste você mesmo: Divida 18 por 16, 14 por 8, 3 por 2.
Então aí temos uma maneira de descobrir a propriedade maior de um número: O número dividido pela propriedade maior deve dar entre 1 e 2.
Mas podemos simplificar isso um pouco mais: dividindo o número pela próxima propriedade, o número será inferior a 1.
Então temos uma regra que pode ser utilizada direto no código: multiplicar um número iniciando em 1 por 2 enquanto o número dado dividido por esse número resulta em um número superior ou igual à 1.
Vamos a um estudo prático, tomando como exemplo o número 21.
21 / 1 = 21, portanto continua
21 / 2 = 10.5, portanto continua
21 / 4 = 5.25, portanto continua
21 / 8 = 2.625, portanto continua
21 / 16 = 1.3125, portanto continua
21 / 32 = 0.65625, opa, é menor que 1, portanto a propriedade maior de 21 é Prop5 ou 16.
Claro, podemos decidir não pegar a propriedade maior de um número, começar a próxima parte direto pela propriedade maior do código (no nosso exemplo, 32), mas dessa maneira fica mais flexível.
Sabendo a propriedade maior, podemos descobrir as propriedades menores. Acontece que é um pouco mais complexo essa parte: um número, menos as suas propriedades maiores já comprovadas, menos uma determinada propriedade, resulta em 0 ou mais caso o número possua tal propriedade, ou menos que 0 caso contrário.
Então mais uma regra para usar direto no código: para cada uma das potências de 2, desde a propriedade maior, se o número menos o a propriedade for igual ou superior a zero, o número possui tal propriedade, e deve ser subtraído da propriedade.
Exemplo prático: partindo do 21 do exemplo anterior, cuja propriedade máxima é Prop5 (16), podemos descobrir quais propriedades pertencem à esse número:
21 - 16 = 5, portanto 21 possui a Prop5 e deve continuar como 5
5 - 8 = -3, portanto 21 não possui a Prop4
5 - 4 = 1, portanto 21 possui a Prop3 e deve continuar como 1
1 - 2 = -1, portanto 21 não possui a Prop2
1 - 1 = 0, portanto 21 possui a Prop1
Tente adicionar Prop1, Prop3 e Prop5. 1 + 4 + 16 = 20 + 1 = 21. Hehe!
Botando isso em código
Porque eu acho que já tenho muitos tutoriais em PHP, irei fazer a parte de código desse tutorial em JavaScript. Pensei em fazer em C++, mas optei por JavaScript porque em todos os fóruns que irei postar esse tutorial tem uma seção para JavaScript ao contrário de C++. Vamos lá!
<script type="text/javascript">
function avaliar(numero){
//pegar a propriedade máxima
while(numero/teste >= 1)
{
teste *= 2;
}
var props = new Array();
//montar a array com as propreidades
for(x = numero; teste >= 1;)
{
if(x - teste >= 0)
{
props.push(raiz(teste));
x-= teste;
}
teste /= 2;
}
}
function raiz(numero)
{
//como nossos números são potências de 2, não precisamos de algo muito complicado, portanto vamos fazer um sistema simples de raiz
var resultado = 0;
for(num = numero; num >= 1; num/=2)
{
resultado++;
}
return resultado;
}
</script>
Espero que tenham gostado pessoal, até a próxima! Façam bom uso desse sisteminha!
Fiquem ligados que vou postar a forma mais "simples" de fazer isso, trabalhando com os códigos binários dos números, logo logo!