【问题标题】:Java quickly access array itemJava快速访问数组项
【发布时间】:2013-03-13 20:56:30
【问题描述】:

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

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

我的问题是:

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

【问题讨论】:

  • 您可以有效地对long中的第一个位进行二进制搜索。
  • 我不明白为什么第二个数字是“数组中的第三个索引”——这是什么意思?十进制和十六进制是 long 的两种 external 表示形式——您可以从 long 中输出十进制数或十六进制数字字符串,但不能“将 long 转换为十六进制”(除非您的意思是到一个十六进制字符串),而且它看起来不像你需要在这里做的事情。看起来更像是一个掩蔽问题。
  • @rcook 一开始我就被吸引住了,但是值不同:在第二种情况下,4 前面有三个 0。第一个值有一个两个多个 0,但这是一个错字我想,还是对long来说太大了。
  • "有没有快速访问数组的方法?"也许。取决于数组元素类型的宽度。理想情况下,如果它是 1 位的,您可以非常便宜地将其所有 16 个值打包到单个 intlong 中,只需 2 次操作即可访问它(例如,(values >>> i) & 0x1,并避免数组边界检查。但如果它是每个元素 2 到 4 位,那么访问每个元素需要 3 次操作,而且它可能不会比正常的数组查找快。

标签: java arrays hex


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,猜测:您有一个 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 位是什么。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 不,Java中的所有原语都以二进制形式存储;十六进制是一种表示二进制数的方式,就像十进制一样。我们仍然不知道 OP 想要做什么;关于“数组中的第三个索引”的含义的信息不足。
      • 很公平。我主要认为十六进制和二进制是相同的,因为它们之间更容易转换,但事实并非如此。但是从技术上讲,你是对的,它们是以二进制形式存储的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 2020-12-11
      • 1970-01-01
      • 2023-04-04
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多