Meilleur moyen de convertir un entier signé en un long non signé?

Pour certaines fonctions de hachage en Java, il serait intéressant de voir la valeur comme un entier non signé (par exemple pour la comparaison avec d’autres implémentations), mais Java ne prend en charge que les types signés. Nous pouvons convertir un entier signé en un “non signé” long 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 réellement. 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 méthode standard de Java 8 est Integer.toUnsignedLong(someInt) , qui équivaut à la réponse de @ Mysticial .

Guava fournit UnsignedInts.toLong(int) … ainsi que divers autres utilitaires sur les 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; } 

Juste mes 2 cents ici, mais je pense que c’est une bonne pratique d’utiliser:

public static long getUnsignedInt(int x) { return x & (~0L); // ~ has precedence over & so no real need for brackets }

au lieu de:

retourne x & 0xFFFFFFFFL;

Dans cette situation, vous ne vous préoccupez pas du nombre de F que contient le masque. Ça marche toujours!

 long abs(int num){ return num < 0 ? num * -1 : num; }