Просто, чтобы уточнить, что это НЕ домашний вопрос, поскольку я видел подобные обвинения, выдвинутые против других хакерских вопросов:
Тем не менее, у меня есть этот бит взлом в C:
#include <stdio.h>
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-разрядный целочисленный журнал 2 работать на Java?
PS Для справки, техника не моя, я позаимствовал ее здесь: http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogIEEE64Float