Неподписанный int64 C ++ для Java

Может ли следующий фрагмент успешно преобразоваться в 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;
}

-6

Решение

Long в Java является 64-битным, но подписанным. Тем не менее, 64-битная версия по-прежнему для вас, чтобы делать все, что вы хотели бы. Так что да, я бы сказал, что вы можете конвертировать код C ++ в Java.

4

Другие решения

Если предположить, что u64 является uint64_tФормально нет. Ява не имеет
тип, который способен представлять все значения
uint64_t, Практически, это зависит от того, что вы делаете
со значениями. Джава делает иметь 64-битный целочисленный тип и
если вы просто смотрите на биты, а не интегральное значение
(или если фактические значения будут соответствовать int64_t), тогда ты можешь
просто используйте long,

Суффикс целочисленного типа будет просто Lи конечно нет
ULL, но в противном случае (для значений, которые вы даете):

long magicTable[] = {
0x1000000010000000L,
0x1000000000010000L,
0x1000000000000001L,
0x0100000001000000L,
0x0000000100000001L
};

должно сработать. Java даже позволит такие вещи, как
0x800000000000000Lдаже если фактическое значение не может быть
представлены в long, (Результирующий значение будет
ngative.)

0

Если у вас нет времени, чтобы разобраться с различиями в языках (C ++ и Java), просто используйте JNI и вы можете легко и эффективно запускать любой код C / C ++ в Java.

-1
По вопросам рекламы [email protected]