为什么JDK使用移位而不是乘法/除法?

Cra*_*lus 7 java collections optimization bit-manipulation priority-queue

我有以下问题:

如果被问到是否使用移位与乘法或除法(例如答案),请让JVM进行优化.

这里的示例:is-shifting-bits-faster-than-multiplying

现在我正在查看jdk源代码,例如Priority Queue,代码仅使用乘法和除法(有符号和无符号)进行移位.

理所当然地认为SO中的帖子是有效的答案我想知道为什么在jdk他们更愿意通过转移来做到这一点?

它是一些与性能无关的微妙细节吗?我怀疑它必须与上/下溢乘法和除法有关但我不确定.

有人有想法吗?使用移位是否能更好地处理溢出问题?或者只是味道问题?

das*_*ght 6

我认为他们在这个具体的例子中使用符号位.Java语言缺少无符号的类型,所以这是不可能效仿a >>> 1a /= 2为使用最显著位数字.请注意代码>>>在整个示例中的使用方式.我有理由相信这是为了充分利用整个比特范围.


Pet*_*rey 5

除了在大多数系统上转换速度快于分区.所述>>>可执行无符号运算,其分裂没有.例如,如果您想要两个值的中点,则需要使用>>>以避免溢出.(有关类似代码,请参阅Arrays.binarySearch)