Jump to content

Conversor Binário>Decimal


AriOps
 Share

Recommended Posts

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

Daniel Correia

Link to comment
Share on other 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

Link to comment
Share on other sites

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

Daniel Correia

Link to comment
Share on other 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

Daniel Correia

Link to comment
Share on other 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 )

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.