如何将Java中Long类型的位运算代码转换为BitSet实现
问题解决说明
报错原因
你收到的类型错误是因为1 << i的运算结果是基础类型int,本身没有and()方法,且Java不支持&运算符直接操作int和BitSet类型的参数。同时你的代码中还存在常量名引用错误,原有Long类型的SETS_OF_BITS_IN_LONG常量已经替换为BitSet类型的SETS_OF_BITS_BITSET,需要修正引用。
原有的位运算逻辑不需要直接平移到BitSet实现中,BitSet已经封装了位判断的原生方法。
正确实现方案
你原来的逻辑本质是判断第i位是否为1,直接调用BitSet的get(int index)方法即可,该方法返回true就代表对应位的值为1,完全不需要手动实现左移、按位与的逻辑。
修正后的calculate方法代码如下:
private static int calculate(BitSet setsOfBits) { int counter = 0; // 只判断前10位的逻辑和原来保持一致 for (int i = 0; i < 10; i++) { // 直接调用get方法判断第i位是否为1 if (setsOfBits.get(i)) { counter++; } } return counter; }
注意事项
你当前提供的bitSetFromString方法存在位序问题:默认会把二进制字符串最左侧的字符对应BitSet的第0位(即原Long类型的最低位,对应1 << 0)。如果你的二进制字符串是按照常规的高位在前的格式书写的,需要调整转换逻辑,避免位序颠倒:
private static BitSet bitSetFromString(String binary) { BitSet bitset = new BitSet(binary.length()); int len = binary.length(); for (int i = 0; i < len; i++) { if (binary.charAt(i) == '1') { // 字符串第i位(左数)对应BitSet的 len-1 -i 位,和常规二进制位序对齐 bitset.set(len - 1 - i); } } return bitset; }
如果确实需要手动模拟左移+按位与的逻辑(无必要性,仅作原理参考),可以写成如下形式:
// 构造仅第i位为1的BitSet,模拟1 << i BitSet mask = new BitSet(); mask.set(i); // 复制mask避免修改原对象,再做按位与 BitSet andResult = (BitSet) mask.clone(); andResult.and(setsOfBits); // 按位与结果非空代表该位为1 boolean result = !andResult.isEmpty();
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

