PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit PHP von dezimal nach binär rechnen



silvercross
18-02-2003, 16:14
$Bin = 10011001;

hallo habe folgende frage:

habe ein script geschrieben, welches eigentlich von dezimal zahlen nach binärzahlen rechnen sollte ... nur es kommen immer falsche werte raus



for ($i=0;$i < strlen($Bin);$i++) {

echo $Dez = pow(($Bin[i] * 2),$i)." ";


}


so sollte ja eigentlich die berechnung laufen ..

1·2 hoch 0 + 0·2 hoch 1 + 0·2 hoch 2 + 1·2 hoch 3 + 1·2 hoch 4 + 0·2 hoch 5 + 0·2 hoch6 + 1·2 hoch 7 = 1 + 0 + 0 + 8 + 16 + 0 + 0 + 128 = 153
hoffe es kann mir wer da helfen ...
dieses skript zählt die ergebnise noch nicht zusammen sondern gibt sie einfach mit einer leerzeile dazwischen aus .. jedoch stimmen die nicht überein ..
wenn ich echo $Bin[i] mache in der for schleife bekomm ich nur 11111111 obwohl mein $Bin ja 10011001 ist;

danke

michael

LKH
18-02-2003, 18:15
Hi,

wie wär's mal mit bindec()?

Description
int bindec ( string binary_string)

Returns the decimal equivalent of the binary number represented by the binary_string argument.

bindec() converts a binary number to an integer. The largest number that can be converted is 31 bits of 1's or 2147483647 in decimal.

See also the decbin() function.

silvercross
18-02-2003, 20:58
ja danke, ich kenne die funktion, aber ich wollte sowas vom anfang an programmierern , die funktionsweise selbst herausfinden und in einem eigenen code umsetzen .. nur leider kommt immer die falsche dez. zahl raus ..

mfg
Michael

silvercross
19-02-2003, 07:56
habe den fehler nun gefunden ..
habe aber eine frage:
wie addiere ich die werte die mir in der variable $Dez entstehen ?




for ($i=0;$i < strlen($Bin);$i++) {

/* Example: $Bin = 1001;
* 1*2 ^0 + 0*2 ^1 + 0*2^2 + 1*2^3 = 1 + 0 + 0 + 8 = 9
*/

$Dez = pow(($Bin[$i] * 2),$i);

}



Danke Michael

silvercross
19-02-2003, 08:03
tja .. leider ist die funktion falsch wie ich grade draufgekommen bin,
sie ist nur bei 9 richtig
hoffe es hat wer eine anregung für mich

mfg
Michael

nickers
19-02-2003, 09:24
Ich habe zwar kaum Ahnung von PHP, aber hier handelt es sich ja eher um ein Logikproblem.
Wenn mich mein Gehirn also jetzt nicht ganz und gar verscheißert, sollte das hier funktionieren:



$Dez=0;
for ($i=1;$i <= strlen($Bin);$i++)
{
$Dez=pow(pow($i, 2),$Bin[$i-1])+$Dez
}

Hierbei allerdings noch die Frage, in welcher Reihenfolge stehen die Werte in deinem Binärstring?

silvercross
19-02-2003, 10:28
deine berechnung liefert leider auch falsche werte ..

nickers
19-02-2003, 10:53
Jupp, ich habs mittlerweile getestet und das auch festgestellt, sorry. Mein Gehirn hat mich doch verscheißert, kann ja mal vorkommen.

Aber hier ist jetzt eine die funktioniert, zumindest bei mir.


$Bin="11111";
$Dez=0;
for ($i=strlen($Bin)-1; $i>=0; $i--)
{
$Dez=(pow(2, strlen($Bin)-1-$i)*(int)substr($Bin, $i,1))+$Dez;
}
echo $Dez;


Ich bin zwar von meinem Werk noch nicht so ganz begeistert, aber es kommen zumindest richtige Ergebnisse raus.

silvercross
19-02-2003, 11:28
danke für deine mühe .. war echt schon nahe am pc aus dem fenster werfen, denn mir ist nachwievor nicht klar was an meiner obigen lösung falsch ist leider ...

mfg
Michael

mehlvogel
19-02-2003, 20:14
Ich glaube falsch ist



$Bin[$i];


Das gibs in PHP nicht, wenn dann:



$Bin{$i};


Dein code @nickers: Kann man auch so vereinfachen:



$Bin = "1010101";
$Dez = 0;

for ($i = 0; $i = strlen($Bin) - 1; $i++) {
$Dez += pow(substr($Bin, $i, 1) * 2, $i);
}
echo $Dez;


Denke das sollte gehen. Wenn man will muss, man natürlich den String vorher umdrehen, vom prinzip her, sollte es s auch gehen.