在ConcurrentHashMap中使用位移运算符的作用

5

当我阅读ConcurrentHashMap源代码时,我遇到了许多位移运算符。一些应用于创建常量,一些应用于变量。

static final int MAXIMUM_CAPACITY = 1 << 30;
static final int MAX_SEGMENTS = 1 << 16; // slightly conservative
long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE;

我不理解,如果像MAXIMUM_CAPACITY这样的常量可以直接声明,那么使用位移运算符有什么用呢。


3
我认为开发者们在以二进制而非十进制的方式思考时,更容易定义这些数值。1 << 30 的二进制表示是 1000000000000000000000000000000,从某种程度上看,它看起来比十进制的 1073741824 更“简单”。 - Mena
1个回答

3

他们没有使用十进制形式(基数为10)的数字。相反,他们说“这是一个有30个尾随0位的数字”,意味着该数字用于二进制系统。

位移操作使得告知读者该值更容易。在十进制中,它将表示为1073741824,看起来像是一个随机数。


这在编程中很常见。例如:

int secondsInDay = 60 * 60 * 24;

我们代表每分钟的秒数,乘以每小时的分钟数,再乘以每天的小时数。我们本可以写成“86400”,但是如果我们想要改变一小时有多少分钟(比如代表其他星球的时间),你将不得不手动计算以更改值。另一方面,通过像上面展示的方式将其分解为单位,我们只需更改中间的“60”即可更改一天有多少分钟。

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