Word in Bit's zerlegen

Hallo
Ist es möglich ein Word (aus Wago 841) in einzelne Bit’s zu zerlegen und dann in 16 einzelne Bit Variablen zu schreiben bzw.umgekehrt ???

Hallo,

Word zu Bit:

<?
$word = 65535;

$bit = array();
for ($i=15; $i>=0; $i--){
	$bit[$i] = ($word >> $i) & 1;           // liefert 0 oder 1
} //endfor
print_r($bit);
?>

Gruß
Attain

1 „Gefällt mir“

Danke das hilft mir schon weiter , aber wie weise ich den jetzt die einzelnen Bit’s einer varialen zu (Bool)?

hast Du doch schon …

$bit[$i]

ist ein Array. In jedem Index steht das jeweilige Bit …

Wenn Du es in 16 IPS-Einzel-Variablen haben willst, sollte das z.B. mit

$word = 2548;

$bit = array();
for ($i=15; $i>=0; $i--){
    $bit[$i] = ($word >> $i) & 1;           // liefert 0 oder 1
    $variablenName = "BitNummer". $i;
    $$variablenName = $bit[$i];
} //endfor
echo "BitNummer0 == ". $BitNummer0 ."
";
echo "BitNummer1 == ". $BitNummer1 ."
";
echo "BitNummer2 == ". $BitNummer2 ."
";
echo "BitNummer3 == ". $BitNummer3 ."
";
echo "BitNummer4 == ". $BitNummer4 ."
";
echo "BitNummer5 == ". $BitNummer5 ."
";

print_r($bit);

Moin Ernie,
ist das denn allg. im PHP Bereich inzwischen üblich die Variablennamen auch über Variablen so zu erzeugen?

 $$variablenName = $bit[$i]; 

Das ist zwar recht elegant manchmal, aber doch eigentlich nix für Anfänger und ich pers. finde es sehr unübersichtlich.
Grüße, Benjamin

Hallo denisweber,

entweder ganz einfach so:


<?
$bit = array();
$word = 1;
for ($i=15; $i>=0; $i--){
	$bit[$i] = ($word >> $i) & 1;           // liefert 0 oder 1
} //endfor
SetValue(12345,$bit[0]);
SetValue(23456,$bit[1]);
.
.
.
SetValue(98765,$bit[15]);
?>

oder halt anders^^ ;).

ist das denn allg. im PHP Bereich inzwischen üblich die Variablennamen auch über Variablen so zu erzeugen?

Hallo Benjamin,

kann man machen, aber ich mag es auch nicht.

ich mag das eigentlich auch nicht und nutze es nur, wenn es nicht anders geht.

Mir fällt das konkrete Beispiel nicht ein, aber in meinem Heizungsscript habe ich das benutzt, weil es nicht anders ging … Ich glaube, es waren Variablennamen die in einem Array stehen und dann neu gesetzt werden sollen oder so ähnlich …

Ich gebe auch zu, dass es nichts ist für Anfänger ist.

ABER: man kann es in der Schleife verwenden :rolleyes: Deshalb hatte ich es gepostet.

Es ist weniger Code, aber nichts für Laien und es macht den Code durchaus schwerer zu lesen … in diesem Falle würde ich es selbst eventuell nutzen, da der Codeteil sehr sehr übersichtlich und verständlich ist.

Und nein, ich glaube, dass das kein guter Stil ist und eigentlich nur in Ausnahmefällen benutzt werden sollte, da die lesbarkeit und Verständlichkeit des Codes vor allen Dingen in größeren Projekten doch sehr leidet …

Hallo Ernie,
ich danke Dir für Deine Antwort … und stimme Dir und Attain natürlich zu! :slight_smile:

Viele Grüße, Benjamin

Danke für die Antwort.
Die Lösung von Attain ist genau was ich gesucht habe.
Noch eine Frage geht das ganze auch anders herum also einzelne Bit’s in ein Word schreiben?

Klar geht das:

<?
$bit = array();
$integer = 0;

$bit[0] = GetValue(12345);
.
.
.
.
$bit[15] = GetValue(99999);

for ($i=0; $i<=15; $i++)
{
$integer += $bit[$i] << $i;
}
echo $integer;

?>

Gruß
Attain

$integer += $bit[$i] << $i; 

Das ist ja wieder einmal eine Kurzform :slight_smile:

Geht aber :wink:

Also zur Erklärung:
1.

$integer +=  .....

Zusätzlich zu dem oben vorgestellten Zuweisungsoperator „=“ gibt es „kombinierte Operatoren“ für alle binären, arithmetischen und String-Operatoren, die es erlauben, den Wert einer Variablen in einem Ausdruck zu benutzen, und dieser anschließend das Ergebnis des Ausdrucks als neuen Wert zuzuweisen.

man könnte auch schreiben:

$integer = $integer + .....
$bit[$i] << $i

$a << $b Nach links verschieben Verschiebung der Bits von $a um $b Stellen nach links (jede Stelle entspricht einer Mulitplikation mit zwei).

Bedeutet wenn man das „Bit 5“ true hat wird es um 5 Stellen nach links geschoben. Man könnte auch 2x2x2x2x2 oder auch 2hoch5 oder auch 32 schreiben.

Gruß
Attain

Danke für die Erklärung.

Ich hoffe meine grauen Zellen speichern das wieder aus wenn ich es suche :smiley: