Можно ли сделать 5-Op Log2(Int 32) Bit Hack на Java?

Просто чтобы уточнить, что это НЕ вопрос домашнего задания, так как я видел подобные обвинения в адрес других битовых хаков:

Итак, у меня есть этот битовый хак на 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

5
задан Jason R. Mick 3 December 2011 в 17:18
поделиться