Pour certaines fonctions de hachage dans Java ce serait bien de voir la valeur comme un entier non signé (par exemple pour la comparaison avec d'autres implémentations) mais Java ne supporte que les types signés . Nous pouvons convertir un int
signé en un long
"non signé" en tant que tel:
public static final int BITS_PER_BYTE = 8;
public static long getUnsignedInt(int x) {
ByteBuffer buf = ByteBuffer.allocate(Long.SIZE / BITS_PER_BYTE);
buf.putInt(Integer.SIZE / BITS_PER_BYTE, x);
return buf.getLong(0);
}
getUnsignedInt(-1); // => 4294967295
Cependant, cette solution semble exagérée pour ce que nous faisons vraiment. Existe-t-il un moyen plus efficace de réaliser la même chose?
Quelque chose comme ça?
int x = -1;
long y = x & 0x00000000ffffffffL;
Ou est-ce que je manque quelque chose?
public static long getUnsignedInt(int x) {
return x & 0x00000000ffffffffL;
}
La manière standard dans Java 8 est Integer.toUnsignedLong(someInt)
, ce qui équivaut à @ Mysticial's answer .
Guava fournit UnsignedInts.toLong(int)
... ainsi qu'une variété d'autres utilitaires sur des entiers non signés.
Vous pouvez utiliser une fonction comme
public static long getUnsignedInt(int x) {
return x & (-1L >>> 32);
}
cependant, dans la plupart des cas, vous n'avez pas besoin de le faire. Vous pouvez utiliser des solutions de contournement à la place. par exemple.
public static boolean unsignedEquals(int a, int b) {
return a == b;
}
Pour plus d'exemples de solutions de contournement pour l'utilisation de valeurs non signées. Classe utilitaire non signée
autre solution.
public static long getUnsignedInt(int x) {
if(x > 0) return x;
long res = (long)(Math.pow(2, 32)) + x;
return res;
}