Java快速访问数组项

时间:2013-03-13 20:56:30

标签: java arrays hex

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

因此上面的数字转换为0x40000000000000000L,这对应于数组中的第一个索引。如果数字是0x0004000000000000L,则它对应于数组中的第3个索引。

我的问题是:

  1. 有快速方法将小数转换为十六进制吗?
  2. 是否有一种快速的方法来访问数组,具体取决于值的位集(而不是使用循环)?

3 个答案:

答案 0 :(得分:1)

如果号码在远程范围内,请使用Long.highestOneBit()。或者,BigInteger使用bitLength()方法。

答案 1 :(得分:0)

记住,Java内部的所有原语都存储为二进制。将它传递给System.out.println()时打印十进制数的事实是该二进制值的视图。因此,如果将十进制存储在基元(double,float,long,integer,short,byte)中,则将其转换为十六进制。如果要将该值转换为十六进制字符串以用于显示目的,可以使用Integer.toHexString(int)。

Java有一个数组大小的上限,它是一个整数,所以2 ^ 31个插槽。除此之外,你必须使用两个或更多结构并将它们组合起来。我想这就是你在做什么。但是,如果你这样做可能使用long,Long.highestOneBit()可能是数组数组的第一个索引,其中每个slow是一个潜在的2 ^ 31个插槽的数组。当然,这对于内存使用来说不是特别有效的结构。但这会给你一个可能长的大小的视图。你可能没有足够的记忆,但谁知道。

答案 2 :(得分:0)

首先,猜测:你有一个很长的时间,你正在查看16个4位数字。您希望将每个4位数用作16元素数组的索引。

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

长篇中有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伪代码。

如果您与'&'并不亲密操作员:它会让你回到其中有1s的位置的零和零,所以&使用0xF将告诉您低位4位是什么。