【发布时间】:2013-03-13 20:56:30
【问题描述】:
我正在做一个返回长十进制的计算,例如 4611686018427387904。我需要先将其转换为十六进制,然后根据设置的位来破解一个大小为 (16) 的数组。
所以上面的数字被转换为 0x40000000000000000L,这对应于数组中的第一个索引。如果数字是 0x0004000000000000L,它对应于数组中的第三个索引。
我的问题是:
- 有没有快速将十进制转换为十六进制的方法?
- 是否有一种根据值的位集访问数组的快速方法(而不是使用循环)?
【问题讨论】:
-
您可以有效地对long中的第一个位进行二进制搜索。
-
我不明白为什么第二个数字是“数组中的第三个索引”——这是什么意思?十进制和十六进制是 long 的两种 external 表示形式——您可以从 long 中输出十进制数或十六进制数字字符串,但不能“将 long 转换为十六进制”(除非您的意思是到一个十六进制字符串),而且它看起来不像你需要在这里做的事情。看起来更像是一个掩蔽问题。
-
@rcook 一开始我就被吸引住了,但是值不同:在第二种情况下,4 前面有三个 0。第一个值有一个两个多个 0,但这是一个错字我想,还是对
long来说太大了。 -
"有没有快速访问数组的方法?"也许。取决于数组元素类型的宽度。理想情况下,如果它是 1 位的,您可以非常便宜地将其所有 16 个值打包到单个
int或long中,只需 2 次操作即可访问它(例如,(values >>> i) & 0x1,并避免数组边界检查。但如果它是每个元素 2 到 4 位,那么访问每个元素需要 3 次操作,而且它可能不会比正常的数组查找快。