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?
7 answers
Coś takiego?
int x = -1;
long y = x & 0x00000000ffffffffL;
Czy coś przeoczyłem?
public static long getUnsignedInt(int x) {
return x & 0x00000000ffffffffL;
}
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 .
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.
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
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;
}
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:
W tej sytuacji nie ma znaczenia, ile ma Maska. To zawsze zadziała!Return x & 0xffffffl;
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;
}
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