Najlepszy sposób na przekonwertowanie podpisanej liczby całkowitej na niepodpisaną długą?

Dla niektórych funkcji hashowych w Javie byłoby miło widzieć wartość jako niepodpisaną liczbę całkowitą (np. dla porównania z innymi implementacjami), ale Java obsługuje tylko typy podpisane. Możemy przekonwertować podpisane int na" niepodpisane " long jako takie:

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

Jednak To rozwiązanie wydaje się przesadą dla tego, co naprawdę robimy. Czy istnieje bardziej efektywny sposób osiągnięcia tego samego?

Author: maerics, 2012-03-06

7 answers

Coś takiego?

int x = -1;
long y = x & 0x00000000ffffffffL;
Czy coś przeoczyłem?
public static long getUnsignedInt(int x) {
    return x & 0x00000000ffffffffL;
}
 83
Author: Mysticial,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 06:00:34

Standardowym sposobem w Javie 8 jest Integer.toUnsignedLong(someInt), co jest równoznaczne z @Mysticial ' s answer .

 26
Author: superEb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:22

Guawa zapewnia UnsignedInts.toLong(int)...jak również wiele innych narzędzi na niepodpisanych liczbach całkowitych.

 16
Author: Louis Wasserman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-09 19:12:26

Możesz użyć funkcji typu

public static long getUnsignedInt(int x) {
    return x & (-1L >>> 32);
}

Jednak w większości przypadków nie musisz tego robić. Zamiast tego możesz użyć obejść. np.

public static boolean unsignedEquals(int a, int b) {
    return a == b;
}

Aby uzyskać więcej przykładów obejścia użycia niepodpisanych wartości. Unsigned utility class

 7
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 08:27:54

Inne rozwiązanie.

public static long getUnsignedInt(int x) {
    if(x > 0) return x;
    long res = (long)(Math.pow(2, 32)) + x;
    return res;
}
 2
Author: lmatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-06 06:19:59

Tylko moje 2 centy tutaj, ale myślę, że to dobra praktyka, aby użyć:

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

Zamiast:

Return x & 0xffffffl;

W tej sytuacji nie ma znaczenia, ile ma Maska. To zawsze zadziała!
 -2
Author: okoopat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-05 11:27:32
long abs(int num){
    return num < 0 ? num * -1 : num;
}
 -4
Author: user2207488,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-19 09:31:39