EnumSet的实现原理
用位向量实现(bit vector)
1个bit代表一个enum,1表示有,0表示无。
enum Color { RED, GREEN, BLUE, YELLOW }
0101就表示{GREEN,YELLOW}
添加元素
bitVector |= (1 << enum.ordinal());
删除元素
bitVector &= ~(1 << enum.ordinal());
检查是否包含
(bitVector & (1 << enum.ordinal())) != 0
求补集(complement)
bitVector = ~ bitVector,取反(0变成1,1变成0)
bitVector &= (1L << universe.length) - 1;
这段代码需要理解一下,一个bitVector未必所有的位数都用到的。一个Int有32位,如果enum总共只有4个,那么之前28位都是无效的,需要把它们都变成0
比方说universe.length=4, 那么 (1L << universe.length) - 1 = 00......00001111
一步一步来看 (1L << universe.length) = 00......00000010000
00......00000010000 - 1 = 00......00001111
还有一种写法是 -1L >>> -universe.length
-1L=111......11111 (64个1)(0xffff)
-1L >>> -4,无符号右移-4,相当于无符号右移64-4=60= -1L >>> 60 = 00......00001111
两个结果是一样的。