关于位运算一点记录(java)
最近在看BitSet源码,是一个求一个算法题
在一个元素为 1 到 100 的整数数组中,如何搜索缺失元素
在其中的一种解法里推荐使用BitSet,利用long类型中的每一位代表一种状态,标识这个位的数字是否存在。
在看到源码
public void set(int bitIndex) {
if (bitIndex < 0)
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
int wordIndex = wordIndex(bitIndex);
expandTo(wordIndex);
words[wordIndex] |= (1L << bitIndex); // Restores invariants
checkInvariants();
}
当bitIndex大于63之后数得到的数据将不再是2的次方,而是得到一个比较小的数字,发现位运算大于数据类型的位数之后将会出现截取的情况。
例如1<<5,运算过程首先把1转变为2进制得到
0000 0000 0000 0000 0000 0000 0000 0001 然后左移5位后,低位补0:
0000 0000 0000 0000 0000 0000 0001 0000 换算成10进制为16
这是因为int占4个字节共4*8bit=32bit
但是当左移位数超过32位时,比如1<<33将得到2
原因就是int高位是符号位,超过int的位后,编译器将自动截除后31位,所以得到的结果就是去除31位后的结果
这种处理方式同样适用于长整型Long