0

我正在做一个返回长十进制的计算,例如 4611686018427387904。我需要先将其转换为十六进制,然后根据设置的位来检查一个大小为 (16) 的数组。

所以上面的数字被转换为 0x40000000000000000L,这对应于数组中的第一个索引。如果数字是 0x0004000000000000L,它对应于数组中的第三个索引。

我的问题是:

  1. 有没有快速将十进制转换为十六进制的方法?
  2. 是否有一种根据值的位集(而不是使用循环)访问数组的快速方法?
4

3 回答 3

1

如果数字在长范围内,请使用Long.highestOneBit()。或者,BigInteger 有一个bitLength()方法。

于 2013-03-13T21:05:07.647 回答
0

请记住,Java 中的所有原语在内部都存储为二进制文件。当您将其传递给 System.out.println() 时它会打印一个十进制数,这一事实是对该二进制值的一种看法。因此,如果将十进制存储在基元(双精度、浮点、长整数、整数、短字节、字节)中,则将其转换为十六进制已经完成。如果您想将该值转换为十六进制字符串以进行显示,您可以使用 Integer.toHexString(int)。

Java 对数组大小有一个上限,它是一个整数,所以 2^31 个插槽。除此之外,您将不得不使用两个或多个结构并将它们组合起来。我想这就是你正在做的事情。但是,如果您这样做,可能会使用 long,并且 Long.highestOneBit() 可能是数组数组的第一个索引,其中每个慢速数组可能是 2^31 个插槽的数组。当然,这对于内存使用而言并不是一种特别有效的结构。但这会给你一个可能是 long 大小的视图。你可能没有足够的内存,但谁知道呢。

于 2013-03-13T21:05:23.927 回答
0

首先,一个猜测:您有一个 long ,您将其视为 16 个 4 位数字。您希望将每个 4 位数字用作 16 元素数组的索引。

我认为最快的方法是使用掩码和一些位移。两者都是快速操作。如果您从底部屏蔽,则不必在屏蔽后移动结果。

long 中有 16 个 4 位分组,因此:

    long l = 1234;
    int[] results = new int[16];
    for (int i=15; i>=0; i--)
    {
        int index = (int)l & 0xF;
        results[i] = index;
        l = l >> 4;
    }

这会从您的 long 的右侧(低位)位获取 16 个索引,并且您说左侧(高位)位是第一个索引。所以这会让它们以相反的顺序排列并相应地存储它们。调整短裤或任何你需要的东西,这会很快。

警告:我没有运行此代码。我的意思是它是一种 java 伪代码。

如果您不熟悉“&”运算符:它会在其中包含 1 的位置返回 1 和 0,因此 & 与 0xF 将告诉您低 4 位是什么。

于 2013-03-13T21:44:50.743 回答