Может ли следующий фрагмент успешно преобразоваться в Java?
u64 magic_table[5] = {
0x1000000010000000ull,
0x1000000000010000ull,
0x1000000000000001ull,
0x0100000001000000ull,
0x0000000100000001ull
};
u64 test(u64 magic_sum, int index) {
u64 before = magic_sum & 0x4444444444444444ull;
u64 after = (magic_sum + magic_table[index]) & 0x4444444444444444ull;
return after & ~before;
}
Long в Java является 64-битным, но подписанным. Тем не менее, 64-битная версия по-прежнему для вас, чтобы делать все, что вы хотели бы. Так что да, я бы сказал, что вы можете конвертировать код C ++ в Java.
Если предположить, что u64
является uint64_t
Формально нет. Ява не имеет
тип, который способен представлять все значения
uint64_t
, Практически, это зависит от того, что вы делаете
со значениями. Джава делает иметь 64-битный целочисленный тип и
если вы просто смотрите на биты, а не интегральное значение
(или если фактические значения будут соответствовать int64_t
), тогда ты можешь
просто используйте long
,
Суффикс целочисленного типа будет просто L
и конечно нет
ULL
, но в противном случае (для значений, которые вы даете):
long magicTable[] = {
0x1000000010000000L,
0x1000000000010000L,
0x1000000000000001L,
0x0100000001000000L,
0x0000000100000001L
};
должно сработать. Java даже позволит такие вещи, как
0x800000000000000L
даже если фактическое значение не может быть
представлены в long
, (Результирующий значение будет
ngative.)
Если у вас нет времени, чтобы разобраться с различиями в языках (C ++ и Java), просто используйте JNI и вы можете легко и эффективно запускать любой код C / C ++ в Java.