php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.07.2008, 16:06  
Neuer Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 11
4yupix befindet sich auf einem aufstrebenden Ast
Standard Bitweise Negation

Hallo,

kann mir jemand bitte einfach erklären, warum aus ~23 eine -24 Zahl wird?

Beispiel: echo ~23 //Ausgabe -24

Ich habe das so verstanden:

Zuerst schreiben wir 23 (binär) auf:
128/64/32/16/8/4/2/1 (TABELLE)

0 0 0 1 0 1 1 1 = 23
Jetzt flippen wir die Zahlen:
1 1 1 0 1 0 0 0 (MSB wird anscheinend automatisch gesetzt?) und addieren eine 1:
1 1 1 0 1 0 0 0
+
0 0 0 0 0 0 0 1
=
1 1 1 0 1 0 0 1
Um jetzt herauskriegen, welcher Zahl das laut TABELLE entspricht, muss man die Zahl wieder flippen:
0 0 0 1 0 1 1 0 = (minus)22

Also ich komme auf 22 und nicht 24.
Ich habe diese Seite http://www.cl.uni-heidelberg.de/kurs...l/page014.html benutzt.

Vielen Dank!
4yupix ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 30.07.2008, 16:11  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Not füllt vor dem Flippen alls maximal mögliche Stellen mit Null auf:
PHP-Code:
echo decbin (23); // 10111
echo decbin (~23); // 11111111111111111111111111101000 
[edit]
und überschreitet nach flippen den BIT Wert, der durch die maximale INT Größe repräsentiert ist:
PHP-Code:
echo decbin (PHP_INT_MAX) , '<br>'
echo ~
23'<br>';
// 1111111111111111111111111111111
// 11111111111111111111111111101000 
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (30.07.2008 um 16:21 Uhr).
nikosch ist gerade online  
Alt 30.07.2008, 16:17  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

wär ja auch doof wenn man für zahlen nur 1 byte zur verfügung hätte
cycap ist offline  
Alt 30.07.2008, 16:25  
Neuer Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 11
4yupix befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

kann dir leider noch nicht folgen. Ist die Rechnung von oben falsch? Wie komme ich dann auf -24? Auch wenn ich alle restliche Bits mit 1 oder 0 fülle, kommte ich nicht auf -24. Ich mache irgendwas falsch.

Danke!
4yupix ist offline  
Alt 30.07.2008, 16:37  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Das genaue Verfahren kann ich nicht erklären, aber (siehe edit): Die Größe von INT ist auf den DEC Zahlwert 2147483647 beschränkt. Alles drüber wird durch einen overflow negativ (interessanterweise werden die overflows vom kleinsten = stellenwert längsten Wert Richtung Null wieder hochgezählt).
Der repräsentierte theoretische INT Wert der obigen Negation ist DEC 4294967272, also wesentlich größer als der maximale Wert und führt zum Überlauf:
PHP-Code:
echo (int) (4294967272); // -24

echo (int) (2147483647);     // 2147483647 (Maximum)
echo (int) (2147483647 1); // -2147483648
echo (int) (2147483647 2); // -2147483647 
Das (int) Casting unterbindet die Verwendung des Float Typs
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (30.07.2008 um 16:45 Uhr).
nikosch ist gerade online  
Alt 30.07.2008, 16:41  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

jop du hat ein bit zu viel wenn du ~23 machst

PHP-Code:
echo decbin(2147483647)."<br>"// 1111111111111111111111111111111
echo decbin(~23); // 11111111111111111111111111101000 -> eine Stelle mehr als Maximum 
cycap ist offline  
Alt 30.07.2008, 16:58  
Neuer Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 11
4yupix befindet sich auf einem aufstrebenden Ast
Standard

Hallo und danke für die Antwort. Vielleicht weiß jemand wie die binäre Umrechnung genau funktioniert, das würde mich interessieren.


Kann es sein, dass die Negation einer Zahl immer um 1 größer ist als die tatsächliche Zahl, oder ist das nur Zufall? Also ~2354 = -2355, ~235445 = -235446
4yupix ist offline  
Alt 30.07.2008, 16:58  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Code:
~0(0) <=> -1(11111111111111111111111111111111)
~1(1) <=> -2(11111111111111111111111111111110)
~2(10) <=> -3(11111111111111111111111111111101)
~3(11) <=> -4(11111111111111111111111111111100)
~4(100) <=> -5(11111111111111111111111111111011)
~5(101) <=> -6(11111111111111111111111111111010)
~6(110) <=> -7(11111111111111111111111111111001)
~7(111) <=> -8(11111111111111111111111111111000)
~8(1000) <=> -9(11111111111111111111111111110111)
~9(1001) <=> -10(11111111111111111111111111110110)
~10(1010) <=> -11(11111111111111111111111111110101)
~11(1011) <=> -12(11111111111111111111111111110100)
~12(1100) <=> -13(11111111111111111111111111110011)
~13(1101) <=> -14(11111111111111111111111111110010)
~14(1110) <=> -15(11111111111111111111111111110001)
~15(1111) <=> -16(11111111111111111111111111110000)
~16(10000) <=> -17(11111111111111111111111111101111)
~17(10001) <=> -18(11111111111111111111111111101110)
~18(10010) <=> -19(11111111111111111111111111101101)
~19(10011) <=> -20(11111111111111111111111111101100)
~20(10100) <=> -21(11111111111111111111111111101011)
~21(10101) <=> -22(11111111111111111111111111101010)
~22(10110) <=> -23(11111111111111111111111111101001)
~23(10111) <=> -24(11111111111111111111111111101000)
~24(11000) <=> -25(11111111111111111111111111100111)
~25(11001) <=> -26(11111111111111111111111111100110)
cycap ist offline  
Alt 30.07.2008, 17:02  
Neuer Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 11
4yupix befindet sich auf einem aufstrebenden Ast
Standard

Gut, kein Zufall.

Ich werde den Thread noch nicht als "erledigt" markieren, da mich eigentlich nur die binäre Umrechnung interessiert hat. Vielleicht hat sich jemand damit beschäftigt.

Danke!
4yupix ist offline  
Alt 30.07.2008, 17:02  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Hängt alles mit dem Vorzeichenbit zusammen. Vgl: Arithmetischer Überlauf – Wikipedia

Zitat:
Ich werde den Thread noch nicht als "erledigt" markieren, da mich eigentlich nur die binäre Umrechnung interessiert hat. Vielleicht hat sich jemand damit beschäftigt.
Was genau willst Du denn noch wissen?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
 


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
Negation seven-12 PHP Tipps 2007 24 02.11.2005 19:47
Regulärer Ausdruck mit Negation? PHP-Fortgeschrittene 23 21.07.2005 09:01

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
bitweise negation, bitweise negieren, negation einer zahl, bit negieren, bit negation, php negate bits, php zahl negieren, bitweise verneinung, bitweise negation beispiel, bitweises negieren, bitweise negierung, bits negieren, php bit negieren, negation bitweise, php bitweise negieren, bitwise negate, bitweise negation ~, int bitweise negieren, alle bits negieren, php bit-wert

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:48 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