Unsigned Integer in Java
lima-city → Forum → Programmiersprachen → Java
addition
beispiel
bit
byte
entsprechende maske
ergebnis
funktion
meinst
meinung
meisten fllen
nutzen
positiv
sofer
variable
vergleichen
wert beitrag
-
Etwas speziell, aber vll interessiert sich jemand dafür.
Manchmal braucht man in Java doch unsigned Integer. OK, dann kann man long nehmen ABER ich weiss einige Gründe die dagegen sprechen (spar ich mir jetzt sonst schreib ich mich dämlich).
Gespeichert und damit gerechnet wird bei signed/unsigned auf die gleiche Art. Nur die Vergleiche > < unterscheiden sich und natürlich die Umwandlung in longs, einen String bzw wie die Literale benutzt werden.
Daher ist es möglich unsigneds in Java nachzurüsten.
Wenn a, b Integer sind, die wie unsigneds interpretiert werden, kann man sie z. B. so vergleichen:
public static int compare(int a, int b){ a += Integer.MIN_VALUE; b += Integer.MIN_VALUE; if(a > b) return 1; else if(a < b) return -1; return 0; }
und so in signed longs umwandeln:
public static long toLong(int a){ long ret; a += Integer.MIN_VALUE; ret = a; ret -= Integer.MIN_VALUE; return ret; }
Das blöde ist, die Literale ergeben keinen Sinn mehr. Ein unsigned-Objekt wäre wohl die sauberste Lösung aber dann bekommt man einen ziemlichen Overhead rein.
Auf gleiche Art kann man auch unsigned longs nachrüsten.
Die beiden Funktionen hab ich mir so ausgedacht, vll fällt jemandem aber hier eine bessere/effizientere Methode ein.
Beitrag geaendert: 26.3.2007 20:03:30 von cga -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich glaube du erzählst Käse, da man dann einfach nicht auf den RAM zugreifen kann. Das kannst du nur in einem kleinen C++/Asselbler Programm lösen. Aber du brauchst sowas sowieso nicht.
Ich würde ja, wenn ich sowas trotzdem brauche C++ oder Assembler nehmen. Ansonsten ist das ja Käse. Sun dachte sich da schon was.
mfg Samson -
Mir fällt doch noch was ein: Mach wirklich so ein Objekt:
class INT { long a; INT( long a ) { if( a < 0 ) javax.swing.JOptionPane.showMessageDialog( null, "Das geht nicht!" ); else this.a = a; } }
Aber welchen Sinn macht das?
Beitrag geaendert: 26.3.2007 20:15:04 von samson -
Signed und Unsigned Werte kann man ganz leicht mit Bit Masken erreichen. Und für Werte die direkt aus dem RAM kommen - VORSICHT - kann man "volatile" Variablen nutzen. Die sind für Threads gedacht, aber ich empfehle sie NICHT zu nutzen solange man nicht weiss was man wirklich tut. Damit kann man sehr leicht die VM crashen lassen ^^
-
@samson: lies dir das mal durch:
http://de.wikipedia.org/wiki/Zweierkomplement
Du brauchst keine direkten Zugriffe auf den RAM.
Lass mal
laufen. Das Ergebnis ist "a > b"! Denn a ist positiv und b ist negativ.int a = 0x70000000; int b = 0x90000000; if(a > b) System.out.println("a > b");
Und darum geht es in meiner Funktion compare, die vergleicht eben indem sie die Zahlen ab Integer.MAX_VALUE nicht als negativ sondern als positiv ansieht.
Signed und Unsigned Werte kann man ganz leicht mit Bit Masken erreichen.
Kannst du mal ein Beispiel posten. Ich wüsste nämlich nicht wie das geht. -
Der Link sollte dir genug dazu vermitteln: http://de.wikipedia.org/wiki/Bitmaske
-
Ich bin ja immer noch der Meinung, dass es auch einfacher geht. Aber steuerst du nicht auch den RAM an? Oder belegst du a und b mit einem hexadezimalen Wert?
Beitrag geaendert: 28.3.2007 13:00:41 von samson -
Ich bin ja immer noch der Meinung, dass es auch einfacher geht.
Dann gib mir mal einen Tipp, wie.
Aber steuerst du nicht auch den RAM an? Oder belegst du a und b mit einem hexadezimalen Wert?
Die Variablen gelangen auf den Heap.
0x90000000 = -1879048192 oder 2415919104. Je nachdem. Die Variable ist einfach eine Zahl, und die kümmert sich nicht darum, ob sie durch Hexadezimal oder Dezimal definiert wurde.
Der Link sollte dir genug dazu vermitteln: http://de.wikipedia.org/wiki/Bitmaske
Na danke. darauf währe ich nie gekommen.
XOR mit 0x80000000 würde zu dem selben Ergebnis führen wie Addition von 0x80000000.
public static int compare(int a, int b){ a = a ^ Integer.MIN_VALUE; b = b ^ Integer.MIN_VALUE; if(a > b) return 1; else if(a < b) return -1; return 0; }
Meinst du sowas? -
Du musst auch schon eine entsprechende Maske nutzen. Für Bytes wäre das 0xFF die man in den meisten Fällen hinzuaddiert und dann - sofern noch benötigt - in einem Integer speichert.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage