2015-08-06 11 views
6

Ho un output da un'applicazione (C++) che memorizza un valore tickcount in un tipo che termina a zero a 2 . (8,589,934,592) (Non avere il codice)Simulazione di un numero senza segno con una potenza pari a due max in java

Ho bisogno di scrivere la mia uscita nello stesso modo. Recupero il tickcount da una C lib attraverso JNA, ma se lo memorizzo in un int questo si estende a -2 (-2,147,483,648) dopo un tickcount di ~ 25 giorni e se lo immagazzino in un lungo periodo continua ad andare oltre 2 .

Come è possibile archiviare (o scrivere) il valore in Java in modo tale da estenderlo (a zero) in 2 ?

(preferibilmente un JRE7- & JRE8- su Win32 & Win64- soluzione Linux compatibile-&)

Per ottenere il TickCount Io uso il seguente:

import com.sun.jna.*; 
public interface Kernel32 extends Library { 
    Kernel32 INSTANCE = (Kernel32) Native.loadLibrary((Platform.isWindows() ? "kernel32" : "c"), Kernel32.class); 

    /** 
    * Retrieves the number of milliseconds that have elapsed since the system was started. 
    * 
    * @return number of milliseconds that have elapsed since the system was started. 
    * @see http://msdn2.microsoft.com/en-us/library/ms724408.aspx 
    */ 
    Long GetTickCount(); 
} 

public interface Clib extends Library { 
    Clib INSTANCE = (Clib) Native.loadLibrary((Platform.isWindows() ? "kernel32" : "c"), Clib.class); 

    /** 
    * Retrieves the number of milliseconds that have elapsed since the system was started. 
    * 
    * @return number of milliseconds that have elapsed since the system was started. 
    */ 
    Long clock(); 
} 

// And later 
Number n = (Platform.isWindows() ? Kernel32.INSTANCE.GetTickCount() : Clib.INSTANCE.clock()).toString()); 

risposta

8

è possibile memorizzare il valore in un long, poi troncare il valore di 33 bit (incarto 2 intorno a 0) facendo:

n &= (1L << 33) - 1; 

Questa è esattamente la stessa:

n &= 0x1_ffff_ffffL; 

che è anche lo stesso di:

n &= 8_589_934_591L; 
+0

questo finirà comunque per overflow – ControlAltDel

+0

@ControlAltDel non se lo fa dopo ogni incremento. – RealSkeptic

+0

@ControlAltDel Dovrebbe traboccare. Non è questo il punto? – Boann

5

soluzione più semplice: è possibile farlo in Java utilizzando un lungo, come

long count; 

public void tick() { 
    count++; 
    count %= 8589934592L; 
} 
Problemi correlati