php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Bitwise Operator Not


 
mchashi
14-11-2008, 21:29 
 
Hallo,

kann mir einer bitte folgenden Ergebnis erklären - wie sich diese ergeben?

$a = 0;
echo ~$a; // -1

echo "<br>";

$a = 3;
echo ~$a; // -4

echo "<br>";

$a = 9;
echo ~$a; // -10

echo "<br>";

$a = -4;
echo ~$a; // 3Mit den anderen Bitwise Operatoren kenne ich mich gut aus, nur den Schnall ich nicht.

Ich hätte gedacht das beim ersten 255 und beim zweiten 252 usw. rauskommt.

Vielen Dank schon mal.

 
h3ll
14-11-2008, 21:34 
 
0 = 00000000b negiert ergibt 11111111b = -1
3 = 00000011b negiert ergibt 11111100b = -4

+127(10) = 01111111(2) = 7F(16)
+ 4(10) = 00000100(2) = 04(16)
+ 1(10) = 00000001(2) = 01(16)
0(10) = 00000000(2) = 00(16)
- 1(10) = 11111111(2) = FF(16)
- 4(10) = 11111100(2) = FC(16)
-127(10) = 10000001(2) = 81(16)
-128(10) = 10000000(2) = 80(16) Quelle: http://de.wikipedia.org/wiki/Zweierkomplement

 
mchashi
14-11-2008, 22:18 
 
ok danke.

woher weiß ich, ob diese bitfolge "11111011" jetzt eine -4 oder eine +251 ist???

 
h3ll
14-11-2008, 22:34 
 
Original geschrieben von mchashi
ok danke.

woher weiß ich, ob diese bitfolge "11111011" jetzt eine -4 oder eine +251 ist???

Wenn die erste Ziffer 1 ist, ist es negativ, wenn 0, dann positiv.

Ein Integer hat, wenn wir jetzt von einem 32bit Betriebssystem mit 32bit CPU ausgehen, 32bit.

251 wäre also binär 00000000 00000000 00000000 11111011.
-4 wäre 11111111 11111111 11111111 11111011.

 
mchashi
14-11-2008, 22:50 
 
echo decbin(10); Ergibt aber 1010 - so wie ich es mir denke. warum sagt du wenn vorne eine 1 steht, ist es immer negativ?

echo bindec(1010); Ergibt +10. Keine Minuszahl.

Irgendwas check ich noch nicht. Wann geht man bei php von einer negativen binärzahl aus und wann nicht...

 
mchashi
14-11-2008, 22:52 
 
gut jetzt hast du oben dein beispiel geändert und ich glaub ich habs jetzt geschnallt. ich werde noch mal ein wenig rumrechnen.

danke schon mal für deine nette hilfe...

 
asp2php
14-11-2008, 22:58 
 
Also intern werden die Zahlen in 8Bit-Block interpretiert, d.h. die Zahl 10 passt noch in 8-Bit-Raster und deshalb auch mit 00001010 dargestellt. Du hast verkürzt geschrieben (4bits verschluckt :D), deshalb sieht es für dich nicht klar. Sobald die Zahl das Raster gesprengt hat, wird 8-Bit zur Dartellung hinzu genommen, bis das Betriebsystem nein sagt (z.B. bei 32-Bit OS ist 32 Bit die Grenze), dann kommt zum overflow und die Zahl wird negiert dargestellt. Bei PHP ist das so, weil die Variablentyp nicht fest vor definiert ist. In anderen Hochsprachen musst du von vorne herein sagen wasfür Typ sie ist, und somit auch den Wertebereich festgelegt hast.

z.B. du definierst a ist vom Typ Byte, also 8-bit und bei einer Berechnung kommt als Ergebnis 128 raus, dann bekommst du einen overflow als runtime error.

 
mchashi
14-11-2008, 22:59 
 
-4 wäre 11111111 11111111 11111111 11111011.
Das ist aber nicht richtig.

Richtig ist: 11111111 11111111 11111111 11111100

Du bringst mich ja ganz durcheinander

 
h3ll
14-11-2008, 23:11 
 
Sorry, aber du hast es selber gesagt, und ich habs aus Faulheit übernommen =)

woher weiß ich, ob diese bitfolge "11111011" jetzt eine -4 oder eine +251 ist???

 
mchashi
15-11-2008, 00:18 
 
Eine Frage hab ich noch.

Gehen wir von einem 32 Bit Integer aus.

Ich habe jetzt $a = 5;
Das ist = 00000000 00000000 00000000 00000101 (2)

$a = ~5;
Das ist = 11111111 11111111 11111111 11111010 (2)

Wie komme ich von der Binärzahl (~5) auf eine Dezimalzahl ???
Welche Rechenschritte sind von Hand nötig?

 
asp2php
15-11-2008, 00:28 
 
Wenn Zahl positiv (höchstwertige Bit ist 0) dann direkt ablesen, wenn Zahl negativ (höchstwertige Bit ist 1) dann einzelne Bit invertieren und 1 dazu addieren (oder richtigerweise: 1 subtrahieren und dann invertieren)

hier: 11111010

1. 00000101
2. 00000110

= -6

 
mchashi
15-11-2008, 00:54 
 
vielen dank, jetzt hab ich es !


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:37 Uhr.