Java

Emulacja liczb unsigned

  • 2008-02-12 19:16
  • 3 komentarze
  • 558 odsłon
  • Oceń ten tekst jako pierwszy

Strona w budowie
Ktoś pracuje nad tą stroną, jej zawartość może się wkrótce zmienić. Prosimy o cierpliwość!



Język Java nie udostępnia typów unsigned. W tym artykule opisane są metody "emulacji" tego typu liczb w Javie.


3 komentarze

turok 2010-05-20 12:20

public final class UnsignedInteger extends Number implements Comparable<UnsignedInteger>{
   
    private static final long serialVersionUID = 1L;
   
    public static long MAX_VALUE = ((long)Integer.MAX_VALUE) << 1;
    public static long MIN_VALUE = 0L;
   
    final private long value;
   
    public UnsignedInteger(String textValue){
        this(Long.parseLong(textValue));
    }

    public UnsignedInteger(long longValue){
        value = longValue & 0xFFFFFFFFL;
    }
   
    public UnsignedInteger add(UnsignedInteger o){
        return new UnsignedInteger(value + o.value);
    }
   
    public UnsignedInteger add(long o){
        return new UnsignedInteger(value + o);
    }
   
    public UnsignedInteger subtract(UnsignedInteger o){
        return new UnsignedInteger(value - o.value);
    }
       
    public UnsignedInteger subtract(long o){
        return new UnsignedInteger(value - o);
    }

    @Override
    public double doubleValue() {
        return (double)value;
    }

    @Override
    public float floatValue() {
        return (float)value;
    }

    @Override
    public int intValue() {
        return (int)value;
    }

    @Override
    public long longValue() {
        return value;
    }

    @Override
    public int compareTo(UnsignedInteger o) {
        if(value - o.value > 0)
            return 1;
        else if (value - o.value < 0)
            return -1;
        return 0;
    }

    @Override
    public int hashCode(){
        return (int)(value & 0x7FFFFFFF);
    }
   
    @Override
    public boolean equals(Object o){
        if (o instanceof UnsignedInteger) {
            UnsignedInteger tmp = (UnsignedInteger) o;
            return value == tmp.value;
        }
        return false;
    }
   
    @Override
    public String toString(){
        return "" + value;
    }
    public static void main (String [] args){
        long tmp0L = 0L;
        long tmp1L = 1L;
        UnsignedInteger ui0 = new UnsignedInteger(tmp0L);
        UnsignedInteger ui_1 = ui0.subtract(tmp1L);
        System.out.println(ui_1 + " : " + Long.toBinaryString(ui_1.longValue()));
    }
}

Odpowiednik w C:


  1. include <stdio.h>
  2. include <stdlib.h>

int main()
{
    long tmp0L = 0L;
    long tmp1L = 1L;
    unsigned int ui0 = tmp0L;
    unsigned int ui1 = ui0 - tmp1L;
    printf("%u \n", ui1);
    return 0;
}

Jak widać wynik jest taki sam czyli wartość obiektu klasy UnsignedInteger nie wychodzi poza 32 bity.

Wibowit 2010-01-24 17:20

Do emulacji typów uint32 wystarczy zrzutować je na longa, a emulacja uint64 to raczej sztuka dla sztuki. Po co komu takie typy?

Kerai 2009-05-10 21:05

Zabierze się ktoś za to? :P