Просто чтобы уточнить, что это НЕ вопрос домашнего задания, так как я видел подобные обвинения в адрес других битовых хаков:
Итак, у меня есть этот битовый хак на C:
#include
const int __FLOAT_WORD_ORDER = 0;
const int __LITTLE_END = 0;
// Finds log-base 2 of 32-bit integer
int log2hack(int v)
{
union { unsigned int u[2]; double d; } t; // temp
t.u[0]=0;
t.u[1]=0;
t.d=0.0;
t.u[__FLOAT_WORD_ORDER==__LITTLE_END] = 0x43300000;
t.u[__FLOAT_WORD_ORDER!=__LITTLE_END] = v;
t.d -= 4503599627370496.0;
return (t.u[__FLOAT_WORD_ORDER==__LITTLE_END] >> 20) - 0x3FF;
}
int main ()
{
int i = 25; //Log2n(25) = 4
int j = 33; //Log2n(33) = 5
printf("Log2n(25)=%i!\n",
log2hack(25));
printf("Log2n(33)=%i!\n",
log2hack(33));
return 0;
}
Я хочу преобразовать его в Java. Пока что у меня получилось следующее:
public int log2Hack(int n)
{
int r; // result of log_2(v) goes here
int[] u = new int [2];
double d = 0.0;
if (BitonicSorterForArbitraryN.__FLOAT_WORD_ORDER==
BitonicSorterForArbitraryN.LITTLE_ENDIAN)
{
u[1] = 0x43300000;
u[0] = n;
}
else
{
u[0] = 0x43300000;
u[1] = n;
}
d -= 4503599627370496.0;
if (BitonicSorterForArbitraryN.__FLOAT_WORD_ORDER==
BitonicSorterForArbitraryN.LITTLE_ENDIAN)
r = (u[1] >> 20) - 0x3FF;
else
r = (u[0] >> 20) - 0x3FF;
return r;
}
(Обратите внимание, что это внутри моего класса битовой сортировки...)
Так или иначе, когда я запускаю это для тех же значений 33 и 25, я получаю 52 в каждом случае.
Я знаю, что целые числа в Java являются знаковыми, поэтому я уверен, что это имеет отношение к тому, почему это не работает. Есть ли у кого-нибудь идеи, как я могу заставить этот 5-оп, 32-битный целочисленный log 2 работать в Java?
P.S. Для справки, техника не моя, я позаимствовал ее отсюда: http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogIEEE64Float