unsigned variablen

  • gibt es eine Möglichkeit in java mit unsigned variablen zu arbeiten? ich will mit 64 bit blöcken arbeiten, habe aber leider das problem, dass der längste(?) datentyp genau 64 bit groß ist und die zahl dann zu groß für den datentyp ist, da die "eingabe" nicht als unsigned betrachtet wird.

  • Gibt es in Java nicht, du kannst aber ein Long Objekt (Oder das primitive Äquivalent) einfach als unsigned behandeln, bei manchen Operationen musst du dann eben aufpassen... Seit Java 8 gibt es Ansatzweise support für unsigned Kram, ist aber kein eigener Typ. *hust* C#


    Let the old ways live and prosper in the hearts of our young


  • Unsigned variablen sind interpretertionssache:

    Code
    1. //Das ist C-Code
    2. char zahl=-5; // 0xFB
    3. unsigned char zahl2 = 251; // 0xFB


    Wenn du also signed variablen in einen vorzeichenlosen String verwandeln willst, musst du eine Methode wie diese verwenden:


    Ich hab den code nicht getestet. außerdem hat der String der einfachkeit halber führende nullen (62 im schlimmsten fall)
    Achja und beim überprüfen ob eine zahl größer ist als eine andere Zahl (die unter 2^63 liegt), musst du das machen:
    [code]if((x>y)||(x<0))[code]

  • das problem daran ist, dass ich auf jedes einzelne bit zugreifen können muss und nicht nur auf die gesamte variable. Aber wenn es so nicht geht erstelle ich mir dann einfach ein boolean array, long war nur dazu gedacht es einfacher zu machen, einen block zu übergeben.


    Edit: Mtgxyz hatte deinen beitrag noch nicht gesehen.
    Edit2: meine blöcke sind 64 bit groß, keine 65 byte

  • Ach auf jedes einzelne bit?
    Byte arrays sind afaik bis zu 2 bytes pro bit. du kannst auch auf longs bitweise zugreifen. Wenn du an das höhste bit willst kannst du endweder

    Code
    1. x|=0x8000000000000000;
    2. //oder
    3. x=~(x-1);


    nehmen. hoffentlich hat das geholfen
    Edit:
    Die funktion von mir eben verwandelt einen (signed) long in einen vorzeichenlosen string. 64-bit (Im binärsystem) sind max. 65 byte. dann noch den terminator (\0) und dann sinds 65.

  • nach meinem wissen sind 64 bit auch im binärsystem 64 bit
    warum rechnet man nicht einfach mod 2, sleichert das ergebnis in einer variable, dividiert den block durch 2, addiert 0x40000000 auf den block,sichert das ergebnis in einem string und hängt das ergebnis mod 2 an?
    (keine garantie)

    das wird so nie funktionieren

  • die funktion ist dafür da gewesen um ein long auf dem bildschirm darzustellen (Oder lesbar in eine datei zu schreiben)


    Die erste zwei zeilen die ich eben gepostet habe, sollte dein problem lösen

    Code
    1. x|=0x8000000000000000; //Setze den 64ten bit
    2. x&=0x7FFFFFFFFFFFFFFF; //Setze den 64ten bit zurück
    3. x^=0x8000000000000000; //Invertiere den 64ten bit


    usw. eigentlich lassen sich mit den 64ten bit dasselbe machen wie mit den anderen 63. Nur sollte man aufpassen, dass man Hexadezimale zahlen verwendet (Die werden unsigned interpretiert), oder man negative zahlen verwendet.