Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

1 Zum Seitenanfang

Mittwoch, 9. September 2009, 12:48

vom Zweierkomplement zum Einerkomplement umrechnen

Um binäre Daten vom Einerkomplement in das Zweierkomplement zu bringen, wird die Bitmaske & 0xFF verwendet.

Da das Zweierkomplement durch hinzuaddieren von 1 zum Einerkomplement gebildet wird, müßte ich ja demzufolge vom zweierkomplement wieder 1 abziehen, um auf das Einerkomplement zurück zu kommen.

Aber welche Bitmaske brauche ich dafür?
 

okki

unregistriert

2 Zum Seitenanfang

Mittwoch, 9. September 2009, 17:33

hinweis: wieso addierst du 0xFF (=11111111b=255) zum einerkompliment, wenn du doch schreibst, dass du 1 dazuaddierst?

grüße okki
 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

3 Zum Seitenanfang

Mittwoch, 9. September 2009, 22:38

Hi

Um seine Verwirrung zum Ausdruck zu bringen:

die FF (hexadezimal für 255 wenn man von null anfängt oder 256 wenn man von 1 anfängt zu zählen) kann man durchaus zum umrechnen benutzen nur gibt es da Bedingungen.

die FF, ich geh jetz mal von einer 4 Byte großen Zahl aus, warum 4 Byte? F = 16 und ein Byte hat bekanntlich 8 Bit -> 4 Byte, hat also in den diversen Darstellungen von Binärzahlen immer eine andere Bedeutung.

Als Binärzahl ist es die 255.
Im Einserkomplement ist es die 0.
Und im Zweierkomplement ist es die -128.

Evtl. hast du deinen Fall oder wo auch immer du das her hast, dem nach missverstanden.

Denn um vom Einer ins Zweierkomplement zu kommen, musst du die Zahl um eins erhöhen. Dies geschieht um die Doppel-Null wegzubringen, da im Einserkomplement die FF sowie die 00 = Null bedeutet. Mit dem addieren erhöht sich dadurch dein negativer Bereich um eine Stelle. Dein positiver bleibt gleich.

Ich hoffe ich konnte Helfen,

Grüße

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Matte« (9. September 2009, 22:38)

 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

4 Zum Seitenanfang

Donnerstag, 10. September 2009, 11:44

Zitat

Um seine Verwirrung zum Ausdruck zu bringen
Wessen Verwirrung? Ich bin nicht verwirrt (zumindest nicht in dieser Problematik). Prinzipiell hatte ich das System schon verstanden.


Aber ich hatte mich oben vielleicht ungünstig bzw. falsch ausgedrückt. Die Bitmaske wird verwendet, um z.B. von einem c++ short(Einerkomplement) zu einem java int (Zweierkomplement)zu kommen ohne das der eigentliche Wert dabei flöten geht.

@okki der (& ) UND-Operator ist nicht (+) Additions-Opperator --> es wird also nicht der Wert 0x00FF = 0xFF hinzuaddiert, sondern das logische UND mit ( 00000000 11111111) auf der ursprüngliche Bitfolge angewandt.

Mir ist schon klar, wie die Bitmaske(& 0xFF) funktioniert und auch, wie ich (rechnerisch) vom Einerkomplement zum Zweierkomplement komme und worin die Unterschiede der beiden liegen.

Ich habe hier nichts mißverstanden, auch wenn ich in diesem Bereich wahrlich kein Crack bin.
Mein Problem ist nur, dass ich nicht weiß, wie ich Werte aus java (Zweierkomplement) für z.B. c++/php wieder zurückverwandle (also aus dem Zweierkomplement möglichst einfach wieder auf das Einerkomplement komme).

Und darum fragte ich, ob es dafür auch so eine nette Bittmaske oder einen ähnlich einfach anwendbaren Weg gibt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ospx« (10. September 2009, 11:44)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

5 Zum Seitenanfang

Donnerstag, 10. September 2009, 12:39

Aber ich hatte mich oben vielleicht ungünstig bzw. falsch ausgedrückt. Die Bitmaske wird verwendet, um z.B. von einem c++ short(Einerkomplement) zu einem java int (Zweierkomplement)zu kommen ohne das der eigentliche Wert dabei flöten geht.


Autsch. C/C++ und co verwenden ebenfalls Zweierkomplement (genauer gesagt rechnet das x86er Rechenwerk mit 2K Zahlen). Einerkomplement ist schwachsinnig, da es hierbei eine doppelte Null (+0, -0) gibt und damit Platz verschwendet wird.
Dein Problem ist, dass Java BIG ENDIAN verwendet und C auf einem x86er LITTLE ENDIAN.

Short in Java: AA BB
Short in C: BB AA
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (10. September 2009, 12:39)

 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

6 Zum Seitenanfang

Donnerstag, 10. September 2009, 12:45

So, wie ich das verstanden habe, gibt unter c/cpp [--> auch php mit pack()] der specifier signed/unsigned an, in welcher Form die Daten gespeichert werden(ob im zweierkomplement oder nicht). Wenn nun ein unsigned short in einen java - int umgewandelt werden muß, brauche ich hierfür die Bitmaske, damit das Vorzeichen richtig gesetzt wird und der absolute Wert erhalten bleibt. Zumindest habe ich das so verstanden.
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

7 Zum Seitenanfang

Donnerstag, 10. September 2009, 13:10

Es gibt den specifier signed und unsigned in C/C++, wobei signed impliziert wird.

Wenn du eine 8Bit Zahl hast die unsigned ist, ist ihr Wertebereich von
00000000b (0)
bis
11111111b (255)
d.h. dieser Wert ist immer positiv.

Für negative Zahlen (signed, standard) werden die Zahlen als 2K-Zahl dargestellt. Dabei gibt das MSB an ob die Zahl positiv(0) oder negativ(1) ist.
Bei 8Bit ist das also:
10000000b ( -128 )
00000000b ( 0 )
01111111b ( 127 )

Umrechnen von unsigned in signed ist nicht einfach nur eine Bitmaske, aber Formeln dafür gibts im I-Net zuhauf.
Soweit erstmal die Zahlendarstellung.
Beim Umrechnen in Java kommt noch das Problem der Endianess hinzu, d.h. in C/C++ kommt dein Least Significant Byte an die niedrigste Speicheradresse, in Java steht es an der höchsten.
Es kann auch sein, dass dein gewünschter Wert nicht darstellbar ist: z.B. 213 ist bei 8Bit signed nicht darstellbar!

Was genau willst du eigentlich machen?
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (10. September 2009, 13:10)

 

okki

unregistriert

8 Zum Seitenanfang

Donnerstag, 10. September 2009, 13:21

eigentlich wollt ich nur darauf hinaus, dass nur durch "& 0xFF" die umwandlung nicht funktionieren kann, da du selber gesagt hast, dass man eins dazuaddieren müsste. da ist auch egal, ob man little endian oder big endian oder die zahl 1byte, 2byte oder meinetwegen 4byte groß ist. du kannst die einfache probe machen, indem du eine negative zahl (aus dem einerkompliment) in das zweierkompliment umwandelst. für einen gegenbeweis bin ich immer offen.

und sorry für mein ausdruck, umgangssprachlich sag ich zum and operator auch immer addieren.

grüße okki
 

Matte

Tripel-As

Dabei seit: 01.01.2009

Beiträge: 154

 

9 Zum Seitenanfang

Donnerstag, 10. September 2009, 13:23

Zitat

Um seine Verwirrung zum Ausdruck zu bringen
Wessen Verwirrung? Ich bin nicht verwirrt (zumindest nicht in dieser Problematik). Prinzipiell hatte ich das System schon verstanden.


@ospx:
ich meinte damit okki.

@Silence:

Gibt es nicht einen Unterschied zwischen Least/Most Significant Bit bzw Byte?
Ich kann mich täuschen aber ich dachte in C/Cpp wird in Bits gezählt.

das würde bedeuten das man die Zahl komplett umdrehen und nur auf das vorzeichen bzw wertebereich achten muss. wie silence schon gesagt hat, eine unsigned zahl von selber größe hat einen anderen wertebereich (mehr + stellen aber keine - stellen) als eine signed variable.
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

10 Zum Seitenanfang

Donnerstag, 10. September 2009, 13:29

Little und Big Endian sind in bestimmten Fällen nicht-nicht Egal:
Der Wert in einem Header eines Datenpacketes aus dem Netzwerk ist Big Endian kodiert.
Dadurch ist es nicht einfach möglich folgendes zu machen

Quellcode

1
2
BYTE *pSize;
unsigned short = *reinterpret_cast<unsigned short*>(pSize);

Der Wert steht als Big Endian in einer Datei gespeichert (z.B. Savegames von Konsolenspielen), gleiches Problem.


@Matte: Ja, natürlich gibt es den, Little und Big Endian unterscheiden sich in der Art, wie Werte im Speicher abgelegt werden. Bei Big ist das MSByte an der ersten Stelle, bei Litte an der letzten.
An der Position vom MSBit der einzelnen Bytes ändert sich indess gar nichts. D.h. ein char wird im Big Endian und Litte Endian gleich kodiert.
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »silence« (10. September 2009, 13:29)

 

okki

unregistriert

11 Zum Seitenanfang

Donnerstag, 10. September 2009, 13:34

oh sorry. ich wollte mit meiner antwort eigentlich nur zum nachdenken anregen, und keine verwunderung ausdrücken! so tief in die materie brauch man meines erachtens nicht gehen. zeigt mit lieber die formel mit der man mithilfe von & 0xFF eine zahl aus dem einerkomplement ins zweierkomplement umwandelt, oder erklärt mir warum das geht! dann bin ich uach für den rest bereit :-)

grüße okki
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

12 Zum Seitenanfang

Donnerstag, 10. September 2009, 14:32

Mit & 0xFF ist so etwas nicht möglich, 1b & 1b ist ja das selbe wie 3*1 oder 3+0.
&0xFF kann bräuchte man nur wenn man z.B. aus einem Int die ersten 8Bit maskieren möchte, ergo für die Umrechnung ins Zweierkomplement nicht notwendig.

2K Umrechnung: X'[n] = (~X[n]) + 1

D.h. 3 nach -3 in 2k: ~0011 = 1100 + 1 = 1101
-3 in 2K nach 3 = ~1101 = 0010 + 1 = 0011;
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog