• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

AriOps

Conversor Binário>Decimal

6 mensagens neste tópico

Boas,

No seguimento do tópico que criei por causa da função str_split, apresento aqui o código de um conversor Binario > Decimal que estou a criar, e que me está a dar um erro.

Fórmula Resumida para transformar Bin em Dec -> Temos por exemplo 1001: 1*(2^3) + 0*(2^2) + 0*(2^1) + 1*(2^0) = 9

Ou seja 1001 em decimal é 9. E com o meu código dá 20! Passo a apresentar o que fiz:

<?php
/****************************
CONVERSOR BINÁRIO > DECIMAL
****************************/
if(!function_exists('str_split')){
   function str_split($string,$split_length=1){
       $count = strlen($string); 
       if($split_length < 1){
           return false; 
       } elseif($split_length > $count){
           return array($string);
       } else {
           $num = (int)ceil($count/$split_length); 
           $ret = array(); 
           for($i=0;$i<$num;$i++){ 
               $ret[] = substr($string,$i*$split_length,$split_length); 
           } 
           return $ret;
       }     
   } 
}
if ($_POST['Submit']) {
$bin = $_POST['bin'];
# Para transformar em decimal, temos de multiplicar 
# cada dígito por 2^n, em que n é o nº de algarismos
# do binário -1.
$freq_1 = count_chars($bin, 1);
$freq_0 = count_chars($bin, 0);
$alg = strlen($bin);
// Isto serve apenas para debug <debug>
echo $alg."<br />";
// </debug>
$array_bin = str_split($bin);
// <debug>
print_r ($array_bin);
echo "<p>";
// </debug>
for ($n=0; $n<=$alg; $n++) {
print $array_bin{$n}*(2^($alg-1));
}
}
?>

O HTML é este:

<html>
<body>
<form action="index.php" method="post">
<input type="text" name="bin" />
<input type="submit" name="Submit" value="Converter" />
</form>
</body>
</html>

Vejam lá se conseguem descobrir o(s) erro(s)...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já arranjei a função:

<?php
if(!function_exists('str_split')){
   function str_split($string,$split_length=1){
       $count = strlen($string); 
       if($split_length < 1){
           return false; 
       } elseif($split_length > $count){
           return array($string);
       } else {
           $num = (int)ceil($count/$split_length); 
           $ret = array(); 
           for($i=0;$i<$num;$i++){ 
               $ret[] = substr($string,$i*$split_length,$split_length); 
           } 
           return $ret;
       }     
   } 
}
?>

Tu é que criaste essa function ou encontraste na net ?

isto pode te ajudar -> http://www.tonymarston.net/php-mysql/converter.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já arranjei a função:

<?php
if(!function_exists('str_split')){
   function str_split($string,$split_length=1){
       $count = strlen($string); 
       if($split_length < 1){
           return false; 
       } elseif($split_length > $count){
           return array($string);
       } else {
           $num = (int)ceil($count/$split_length); 
           $ret = array(); 
           for($i=0;$i<$num;$i++){ 
               $ret[] = substr($string,$i*$split_length,$split_length); 
           } 
           return $ret;
       }     
   } 
}
?>

Tu é que criaste essa function ou encontraste na net ?

isto pode te ajudar -> http://www.tonymarston.net/php-mysql/converter.html

essa tirei do php.net

quanto a esse conversor, não ajuda muito, não é bem o que pretendo...isso tem só uma função que converte tudo para decimal, mas eu so quero binário - e ser eu a fazer também.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem já passou um bocado desde o outro post, mas só agora tive tempo para olhar para isto... aqui vai:

PHP

<?php
/****************************
CONVERSOR BINÁRIO > DECIMAL
****************************/
if(!function_exists('str_split')){
   function str_split($string,$split_length=1){
       $count = strlen($string); 
       if($split_length < 1){
           return false; 
       } elseif($split_length > $count){
           return array($string);
       } else {
           $num = (int)ceil($count/$split_length); 
           $ret = array(); 
           for($i=0;$i<$num;$i++){ 
               $ret[] = substr($string,$i*$split_length,$split_length); 
           } 
           return $ret;
       }     
   } 
}
if (isset($_POST['hid'])) {
$bin = $_POST['bin'];
# Para transformar em decimal, temos de multiplicar cada dígito por 2^n, em que n é o nº de algarismos do binário -1.
$alg = strlen($bin);
// <debug>
echo "Número de Algarismos: ".$alg."<p>";
// </debug>
$array_bin = str_split($bin);
// <debug>
echo "</p>O array do binário é: ";
print_r ($array_bin);
echo "<p>";
// </debug>
for ($n=0; $n<=($alg-1); $n++) {
$array_dec{$n} = (($array_bin{$n})*(2^(($alg-1)-$n)));
}
echo "O array decimal é: ";
print_r ($array_dec);
echo "</p>";
$res = array_sum($array_dec);
echo "<p><strong>Resultado: ".$res."</strong>";
}
?>

HTML

<html>
<body>
<form action="index.php" method="post">
<input type="text" name="bin" />
<input type="submit" id="Submit" name="Submit" value="Converter" />
<input type="hidden" name="hid" />
</form>
</body>
</html>

Vou dar um exemplo para expor o meu problema...

- Se eu insiro 1 o resultado dá-me 2, quando devia ser 1...

- Se eu insiro 10 o resultado dá-me 3, quando devia ser 2...

Aqui vai o output dos dois exemplos que dei:

1

Número de Algarismos: 1

O array do binário é: Array ( [0] => 1 )

O array decimal é: Array ( [0] => 2 )

Resultado: 2

10

Número de Algarismos: 2

O array do binário é: Array ( [0] => 1 [1] => 0 )

O array decimal é: Array ( [0] => 3 [1] => 0 )

Resultado: 3

Nestes exemplos fico sempre com uma unidade a mais no valor convertido do 1 do binário...

Vejam lá se me conseguem ajudar...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O erro está neste ciclo:

for ($n=0; $n<=($alg-1); $n++) {
$array_dec{$n} = (($array_bin{$n})*(2^(($alg-1)-$n)));
}

A iteração devia ser assim:

$array_dec{$n} = ($array_bin{$n}*pow(2,($alg-1)-$n));

Ou assim:

$array_dec{$n} = ($array_bin{($alg-1)-$n}*pow(2,$n));

De realçar que esta é a primeira vez que brinco com PHP. Para ajudar o nosso colega AriOps, lá fui eu testar isto. A princípio julguei que fosse algum problema de algoritmo, mas afinal era simplesmente o 2^$n que tinha que ser substituido pela função pow ( base, expoente )

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

era essa função que não conhecia, eu bem fui pesquisar no php.net mas não tinha encontrado, obrigado!

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora