AriOps Posted June 23, 2006 at 03:02 PM Report #34435 Posted June 23, 2006 at 03:02 PM 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
kingless Posted June 23, 2006 at 03:19 PM Report #34439 Posted June 23, 2006 at 03:19 PM 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
AriOps Posted June 23, 2006 at 04:23 PM Author Report #34454 Posted June 23, 2006 at 04:23 PM 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
AriOps Posted June 25, 2006 at 12:10 AM Author Report #34643 Posted June 25, 2006 at 12:10 AM 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
dozy Posted July 6, 2006 at 04:38 PM Report #36618 Posted July 6, 2006 at 04:38 PM 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 )
AriOps Posted July 6, 2006 at 08:00 PM Author Report #36686 Posted July 6, 2006 at 08:00 PM era essa função que não conhecia, eu bem fui pesquisar no php.net mas não tinha encontrado, obrigado! Cumps Daniel Correia
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now