关于位运算一点记录(java)

关于位运算一点记录(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值