Niet ondertekend lang in Java

Momenteel gebruik ik getekende waarden, -2^63 tot 2^63-1. Nu heb ik hetzelfde bereik nodig (2 * 2 ^ 64), maar met alleen positieve waarden. Ik vond de Java-documentatie waarin niet-ondertekend lang werd genoemd, wat geschikt is voor dit gebruik.

Ik heb geprobeerd 2^64 te declareren bij een Long wrapper-object, maar het verliest nog steeds de gegevens, met andere woorden, het legt alleen vast tot de Long.MAX_VALUE, dus ik mis duidelijk iets.
Is BigIntegerde ondertekende lange die Java ondersteunt?

Is er een definitie of aanwijzing voor het declareren en gebruiken ervan?


Antwoord 1, autoriteit 100%

In Java 8 is ondersteuning voor unsigned longgeïntroduceerd. Toch zijn dit typische longen, maar het teken heeft geen invloed op optellen en aftrekken. Voor delen en vergelijken heb je speciale methoden in Long. U kunt ook het volgende doen:

long l1 = Long.parseUnsignedLong("12345678901234567890");
String l1Str = Long.toUnsignedString(l1)

BigIntegeris een beetje anders. Het kan enorme aantallen behouden. Het slaat ze op als int[]en ondersteunt rekenkunde.


Antwoord 2, autoriteit 61%

Hoewel Java geen niet-ondertekend lang type heeft, kunt u ondertekende 64-bits twee-complement gehele getallen (d.w.z. longwaarden) als niet-ondertekend behandelen als u er voorzichtig mee bent.

Veel primitieve integer-bewerkingen zijn teken-agnostisch voor twee-complement-representaties. U kunt bijvoorbeeld Java primitief optellen, aftrekken en vermenigvuldigen op een niet-ondertekend getal dat wordt weergegeven als een long, en het “juiste” antwoord krijgen.

Voor andere bewerkingen zoals divisie en vergelijking, biedt de Longklasse methode zoals divideUnsigneden compareUnsigneddie de juiste resultaten oplevert voor niet-ondertekend nummers weergegeven als Longwaarden.

De LongWerkwijzen die niet-ondertekende operaties ondersteunen, werden toegevoegd in Java 8. Voorafgaand aan dat, kunt u 3RD-party-bibliotheken gebruiken om hetzelfde effect te bereiken. Bijvoorbeeld, de statische methoden in de guava UnsignedLongsklasse.


is BigIntegerDe ondertekende lange die Java ondersteunt?

BigIntegerzou een andere manier zijn om gehele getalwaarden te vertegenwoordigen die groter is dan Long.MAX_VALUE. Maar BigIntegeris een klassen met zware gewicht. Het is niet nodig als uw nummers allemaal binnen het bereik van 0 tot 2 64 – 1 (inclusief) vallen.


Antwoord 3, Autoriteit 9%

Als het gebruik van een bibliotheek van derden een optie is, is er joou (een spin-off-bibliotheek van jooq ), die wrappertypen biedt voor niet-ondertekende gehele getallen in Java. Dat is niet precies hetzelfde als het hebben van primitieve type (en dus bytecode) ondersteuning voor niet-ondertekende types, maar misschien is het nog steeds goed genoeg voor uw gebruik.

import static org.joou.Unsigned.*;
// and then...
UByte    b = ubyte(1);
UShort   s = ushort(1);
UInteger i = uint(1);
ULong    l = ulong(1);

Al deze typen verlengen java.lang.Numberen kan worden geconverteerd naar primitieve typen van hogere orde en BigInteger. In uw geval bewaarden eerdere versies van Joou eenvoudig de niet-ondertekende langewaarde in een BigInteger. Versie 0.9.3 Verschuift een koele bit om te passen in de waarde in een gewone Long.

(Disclaimer: Ik werk voor het bedrijf achter deze bibliotheken)

Other episodes