59 votes

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

Pour certaines fonctions de hachage en Java, il serait agréable de voir la valeur sous la forme d'un nombre 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 une valeur signée int à un "non signé" long comme 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 excessive pour ce que nous faisons réellement. Existe-t-il un moyen plus efficace d'obtenir le même résultat ?

101voto

Mysticial Points 180300

Quelque chose comme ça ?

int x = -1;
long y = x & 0x00000000ffffffffL;

Ou est-ce que je rate quelque chose ?

public static long getUnsignedInt(int x) {
    return x & 0x00000000ffffffffL;
}

54voto

superEb Points 5225

La méthode standard dans Java 8 est Integer.toUnsignedLong(someInt) ce qui est équivalent à La réponse de @Mysticial .

18voto

Louis Wasserman Points 67557

Goyave fournit UnsignedInts.toLong(int) ...ainsi qu'une variété d'autres utilitaires sur les entiers non signés.

8voto

Peter Lawrey Points 229686

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 ex.

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

2voto

lmatt Points 147

Autre solution.

public static long getUnsignedInt(int x) {
    if(x > 0) return x;
    long res = (long)(Math.pow(2, 32)) + x;
    return res;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X