php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.03.2011, 19:22  
Erfahrener Benutzer
 
Benutzerbild von dreamcatcher
 
Registriert seit: 28.12.2010
Beiträge: 602
PHP-Kenntnisse:
Anfänger
dreamcatcher wird schon bald berühmt werden
Standard [Erledigt] Binaerzahlumwandlung || bitweisen UND (&)

Es geht um ein Script, welches einen Integer in die Binärschreibweise umwandelt.

Vorgabe ist, dass eine Zahl zwischen 0 und 255 eingegeben wird.

Der entsprechende Teil:

PHP-Code:
    for ($i=7$i >= 0$i--){
        if (
$zahl pow(2$i)) {
            
$binaerwerte[$i] = 1;
        } else {
            
$binaerwerte[$i] = 0;
        }
    
$ergebnis join (""$binaerwerte
Nun verstehe ich die zweite Zeile nicht.

Ich habe seit gestern überlegt und dachte nach "einmal drüber schlafen" kommt eine neue Erkenntnis, es kamen auch welche aber nicht die "Ich habe verstanden" Lösung.

Was ich getan habe:

Was ist das Bitweise UND ?
1010 & 0011 // Erg: 0010

Sprich das gewöhnliche "und" nur auf Bitebene.

Nun zur Problemstelle:

PHP-Code:
if $zahl pow(2$i
Nehmen wir an $zahl ist 20.
Nun wird mit dem Bit-Operator im ersten Durchlauf folgendes verglichen:

PHP-Code:
if 20 2^
2^7 ist 128.
Da es ein Operator ist, welcher auf Bit-Ebene arbeitet wird intern ein Vergleich herangezogen.

20 = 10100
128 = 10000000

PHP-Code:
10100 10000000 
Da von rechts nach links verglichen wird kommt folgendes heraus

PHP-Code:
00000 
Wow... jetzt beim aufschreiben scheine ich es kapiert zu haben.
Sofern es korrekt ist, dass

PHP-Code:
if (0000
immer ein false gibt.
Rein logisch muss dies so sein, da ansonsten nicht in den else Zweig gehen würde. (War eine Frage)

Rein logisch würde dies nun das Verhalten erklären, da 0 = aus (false) und 1 = an (true) ist.


Es geht mir darum, zu wissen, ob ich es nun richtig verstanden und wiedergegeben habe oder nicht.

Frage Nr 2 :
Das obige Script ist nichts anderes als die Function decbin(), richtig ?
(Sowei richtig verstanden vom Manual)

Geändert von dreamcatcher (31.03.2011 um 19:27 Uhr).
dreamcatcher ist gerade online   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.03.2011, 19:32  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von dreamcatcher Beitrag anzeigen
PHP-Code:
10100 10000000 
Da von rechts nach links verglichen wird kommt folgendes heraus
PHP-Code:
00000 
Da wird nichts „verglichen“, sondern es wir bitweise verknüpft.

Und dass 00000 heraus kommt, kann man auch nur schlecht so sagen.
Beim Umgang mit Binärzahlen (außerhalb des Rechners) sorgt man idR. erst mal dafür, dass beide die gleiche Anzahl von Stellen haben.
Code:
  00010100
& 10000000
----------
  00000000
So könnte man das schon eher sinnvoll aufschreiben.

Im Rechner selbst kommt dann noch hinzu, dass seltenst mit einzelnen Bits gearbeitet wird - sondern idR. mit mindestens einem Byte, und wenn es mehr als Acht Stellen sind dann auch mit sowas wie einem word oder double word.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 31.03.2011, 19:33  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo,

das bitweise UND hast du richtig beschrieben. Am einfachsten ist es du schreibst die Zahlen untereinander, rechtsbündig (fehlende Stellen mit 0 links aufgefüllt). Wo zwei 1er untereinanderstehen kommt im Ergebnis eine 1, sonst 0.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 31.03.2011, 20:20  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Und gleich noch ein Profitipp:

PHP-Code:
pow(2$i); 
Das ist ein sogenanntes Bit-Shifting, d.h. das Bit an Position $i wird gesetzt.
PHP kennt dazu auch 2 Operatoren: << und >> (links shiften, bzw. rechts shiften). Das "Verschieben" von Bits kommt einer Multiplikation/Division mit einer bestimmten 2er Potenz gleich:

1<<0 = 2^0 // 1
1<<1 = 2^1 // 2 bzw. 1*(2^1)
1<<2 = 2^2 // 4 bzw. 1*(2^2)
1<<3 = 2^3 // 8 bzw. 1*(2^3)
usw.

Umgekehrt klappt das natürlich auch (der Exponent wird negativ):
1 >> 0 = 2^(-0) // 1
1 >> 1 = 2^(-1) // 0.5 bzw. 1/(2^1)
1 >> 2 = 2^(-2) // 0.25 bzw. 1/(2^2)
1 >> 3 = 2^(-3) // 0.125 bzw. 1/(2^3)
usw.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 31.03.2011, 20:30  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von lstegelitz Beitrag anzeigen
PHP-Code:
pow(2$i); 
Das ist ein sogenanntes Bit-Shifting, d.h. das Bit an Position $i wird gesetzt.
Nee, das ist in erster Linie nur die mathematische Operation des Potenzierens.

Mit dem Wert 2 als Basis entspricht das dann dem Setzen nur eines einzelnen Bits an Position $i, ja.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 31.03.2011, 20:52  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Jaaa, du hast natürlich Recht

Im Bereich der Bit-Operationen wohl die einzig sinnvolle Art für pow() m.M.n.

PHP-Code:
if ($zahl pow(2$i))
// ==
if ($zahl & (<< $i)) 
Letzteres ist eben C-Style aus den alten DOS Tagen.

Das Arbeiten mit einzelnen Bits ist eine fast ausgestorbene Kunst inzwischen. Wenn ich da an meine C-Anfangszeit denke, als Bitmasken noch alltägliches Handwerkszeug waren, weil Speicher knapp bemessen war, und die Systemumgebung sonst nicht viel hergab... da haben wir uns noch richtig was einfallen lassen müssen, um viel Info in wenig Platz unterzubringen
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 31.03.2011, 21:16  
Erfahrener Benutzer
 
Benutzerbild von dreamcatcher
 
Registriert seit: 28.12.2010
Beiträge: 602
PHP-Kenntnisse:
Anfänger
dreamcatcher wird schon bald berühmt werden
Standard

Danke für das Feedback.

Was ich außerdem gefunden habe ist, dass

PHP-Code:
$i 
quasi das Gleiche ist wie

PHP-Code:
$i 
Da es auf Bitebene (Bzw. Byteebene, wie aus diesem Thread gelernt) arbeitet, ist es dann auch "schneller" ?

Somit würde ich mir angewöhnen Modulo immer wie die Variante 1 zu schreiben... dann vergisst man das mit den Binärmustern nicht so schnell.

Zitat:
Zitat von lstegelitz Beitrag anzeigen
Jaaa, du hast natürlich Recht
Das Arbeiten mit einzelnen Bits ist eine fast ausgestorbene Kunst inzwischen. Wenn ich da an meine C-Anfangszeit denke, als Bitmasken noch alltägliches Handwerkszeug waren, weil Speicher knapp bemessen war, und die Systemumgebung sonst nicht viel hergab... da haben wir uns noch richtig was einfallen lassen müssen, um viel Info in wenig Platz unterzubringen
Und die alten monochromen Monitore erst einmal...
dreamcatcher ist gerade online   Mit Zitat antworten
Alt 31.03.2011, 21:23  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von dreamcatcher Beitrag anzeigen
Was ich außerdem gefunden habe ist, dass
PHP-Code:
$i 
quasi das Gleiche ist wie
PHP-Code:
$i 
Glaub nicht jeden Mist, den du liest
Code:
$i = 5;
var_dump($i & 0);
var_dump($i % 2);
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 31.03.2011, 21:57  
Erfahrener Benutzer
 
Benutzerbild von dreamcatcher
 
Registriert seit: 28.12.2010
Beiträge: 602
PHP-Kenntnisse:
Anfänger
dreamcatcher wird schon bald berühmt werden
Standard

Mist verdammter... dritter inhaltlicher Schreibfehler in meinem PHP Buch

Nach ein bisschen Gehirnschmalz bin ich auf folgendes gekommen (Die Grundüberlegung war richtig, aber wahrscheinlich wieder ein Druckfehler im Buch...):

PHP-Code:
$i pow(20
bzw. wenn ich das neu gelernte gleich verwende

PHP-Code:
$i << 
ist gleich

PHP-Code:
$i 
wodurch sich nun den Umstand ergibt, dass dies wieder eine längere Schreibweise mit sich zieht...

daher geht natürlich auch

PHP-Code:
$i 

Geändert von dreamcatcher (31.03.2011 um 22:01 Uhr).
dreamcatcher ist gerade online   Mit Zitat antworten
Alt 31.03.2011, 22:09  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

Du kannst dich ja mal ein bisschen mit Schachprogrammierung/Bitboards beschäftigen, danach bist du Fit :
http://chessprogramming.wikispaces.com/Bitboards

Bei der Zuordnung Quadrat => Linie/Reihe bin ich auch auf die Bitoperation von Modulo bzw. Ganzzahlige Division gestoßen:
http://chessprogramming.wikispaces.c...Considerations
Zitat:
squareIndex = 8*rankIndex + fileIndex
FileIndex = squareIndex modulo 8 = squareIndex & 7
RankIndex = squareIndex div 8 = squareIndex >> 3
hts ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Wozu sind die Bitweisen Operatoren gut? einballimwasser PHP Tipps 2009 9 04.06.2009 13:02

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php vergleich bitweise

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:32 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum