[JAVA]从特定索引的long变量中清除一点时,我有一个小问题。
该方法适用于几乎所有情况,但是当我尝试清除(设置为0)msb(最高有效位)时失败。
public static long clear(long bitSet, int bitIndex) {
bitSet &= ~(1L << bitIndex);
return bitSet;
}
我真的无法解决这个错误...
我在这里做错了什么?
任何帮助是极大的赞赏!提前致谢!!!
示例:如果您输入524552L,则输出264L
以二进制形式(相同示例):10000000000100001000-> 100001000
虽然它应该输出-> 00000000000100001000
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
为了解决您在Java中尝试清除特定索引(尤其是最高有效位MSB)的long型变量中的比特位时遇到的问题,我们可以采用位运算来实现这一需求。根据您的描述,问题出在尝试清零MSB时方法未能如预期工作。下面是修正后的方法及解释:
public static long clear(long bitSet, int bitIndex) {
// 确保bitIndex是在long类型的范围内
if (bitIndex < 0 || bitIndex > 63) {
throw new IllegalArgumentException("bitIndex must be in the range of 0 to 63");
}
// 创建一个掩码,该掩码在bitIndex位置为0,其余位置为1
// 使用1L左移bitIndex位,然后取反得到掩码
long mask = ~(1L << bitIndex);
// 将原始值与掩码进行按位与操作,以清除指定位置的比特位
return bitSet & mask;
}
关键点说明:
bitIndex
是否在0到63之间来确保它是一个有效的long类型比特位索引。bitIndex
位得到一个值,然后对其取反(~
)实现。&
)操作符将原始bitSet
与构造的掩码相与,这样所有与掩码中为1对应的位保持不变,而目标位由于掩码中为0,因此被置为0。此方法适用于包括MSB在内的任何比特位,确保了无论bitIndex
为何值,都能正确地清除指定位置的比特位。