Java有符号右移

4

我在Java代码中见过这个。

int n = 300 //passed through a function
size = (n + 31) >> 5 //size = 10

数字5的意义是什么? 数字31的意义是什么?//可能与int类型大小有关(31位+1个符号)

谢谢

1个回答

6
数字5的意义在于,32 = 2^5。
size = (n + 31) >> 5

size设置为ceiling(n/32),这是存储n位标志所需的32位整数的数量。

将31加到n上是为了确保被除数至少与n大于或等于的最小32的倍数一样大。


1
@TheZ 这与它没有太大关系。为了更容易理解,将其重写为:(n + 31) / 32,意思是“获取 n / 32 的上限”-这对于每个数字都有效,即 (n + x - 1) / x 将是一般解决方案。移位而不是除法也混合在这里,但这是一个单独的话题,我认为这里的大多数人都已经知道了。 - Voo
我认为这个不能比 (n + 31) / 32 更有效率吧? - Cory Kendall
@CoryKendall 如果编译器愚蠢的话,它是可以的。但由于通常只需要进行一次计算以找到所需数组的大小,因此没有真正的理由去做这件事,除了太习惯位操作。 - Daniel Fischer
3
如果 n < 0,则它并不相等,所以编译器不能在所有情况下避免除法,因此如果你知道 n > 0(而编译器并不知道),或者你确实想要对负数进行不同的解释,那么这可能会有所帮助。(请注意,即使 n 可能为负数,编译器仍然可以通过更多的工作来欺骗一点并避免除法。) - Voo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接