Wystarczy, aby wyjaśnić to nie jest kwestia pracy domowej, jak widziałem podobnych oskarżeń wobec innych pytań bitowych-hackish:Czy procesowanie 5-Op Log2 (Int 32) może być wykonane w Javie?
Powiedział, że mam ten bit włamać się w katalogu 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;
}
chcę przekonwertować to na Javę. Do tej pory co mam to:
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;
}
(Uwaga to wewnątrz bitonic klasy sortowni kopalni ...)
Tak czy inaczej, kiedy biegnę to dla tych samych wartości 33 i 25, mam 52 w w każdym przypadku.
Wiem, że liczby całkowite Java są podpisane, więc jestem prawie pewien, że ma to coś wspólnego z tym, dlaczego to się nie udaje. Czy ktoś ma jakieś pomysły, w jaki sposób mogę uzyskać ten 5-op, 32-bitowy dziennik 2 do pracy w Javie?
P.S. Dla przypomnienia, technika nie jest moja, pożyczałem ją stąd: http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogIEEE64Float
Korekta: liczby całkowite Java są podpisane. W rzeczywistości każdy podstawowy typ danych z wyjątkiem 'char' jest podpisany. –
Użyj ">>>", aby uzyskać logiczną prawą zmianę, która nie powtarza znaku. – fuz
Przepraszam Sanjay, to jest to, co chciałem powiedzieć (że są podpisane) .... Zmieniam tekst ... –