Chỉ cần làm rõ điều này là không một câu hỏi bài tập về nhà như tôi đã nhìn thấy những cáo buộc tương tự nhắm vào các câu hỏi chút-hackish khác:Có thể thực hiện Bit-5 Log2 (Int 32) Bit trong Java?
Điều đó nói rằng, tôi có chút này hack trong 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;
}
Tôi muốn để chuyển đổi sang Java. Cho đến nay những gì tôi có là:
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;
}
(Lưu ý nó bên trong một lớp phân loại bitonic của tôi ...)
Nhưng dù sao, khi tôi chạy này cho cùng một giá trị 33 và 25, tôi nhận được 52 trong mỗi trường hợp.
Tôi biết số nguyên của Java được ký, vì vậy tôi khá chắc chắn rằng có điều gì đó liên quan đến lý do tại sao điều này không thành công. Có ai có bất kỳ ý tưởng làm thế nào tôi có thể nhận được 5-op, 32-bit số nguyên log 2 để làm việc trong Java?
P.S. Đối với hồ sơ, kỹ thuật này không phải của tôi, tôi mượn nó từ đây: http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogIEEE64Float
Chỉnh sửa: Số nguyên của Java được ký. Như một vấn đề của thực tế, mọi kiểu dữ liệu số nguyên thủy ngoại trừ 'char' được ký. –
Sử dụng '>>>' cho phép dịch hợp lý không lặp lại dấu. – fuz
Xin lỗi Sanjay đó là điều tôi muốn nói (rằng họ đã ký) .... Tôi đang thay đổi văn bản ... –