web-dev-qa-db-fra.com

La meilleure façon de convertir un entier signé en un long non signé?

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?

48
maerics

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;
}
86
Mysticial

La manière standard dans Java 8 est Integer.toUnsignedLong(someInt) , ce qui équivaut à @ Mysticial's answer .

33
superEb

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

17
Louis Wasserman

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

7
Peter Lawrey

autre solution.

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