开发者社区 问答 正文

Java中长期问题中最重要的部分的转移

[JAVA]从特定索引的long变量中清除一点时,我有一个小问题。

该方法适用于几乎所有情况,但是当我尝试清除(设置为0)msb(最高有效位)时失败。

public static long clear(long bitSet, int bitIndex) {

    bitSet &= ~(1L << bitIndex);


    return bitSet;
}

我真的无法解决这个错误...

我在这里做错了什么?

任何帮助是极大的赞赏!提前致谢!!!

示例:如果您输入524552L,则输出264L

以二进制形式(相同示例):10000000000100001000-> 100001000

虽然它应该输出-> 00000000000100001000

展开
收起
几许相思几点泪 2019-12-15 20:03:40 646 分享 版权
阿里云 AI 助理回答

为了解决您在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;
}

关键点说明:

  1. 范围检查:首先,我们通过检查bitIndex是否在0到63之间来确保它是一个有效的long类型比特位索引。
  2. 掩码创建:为了清除某个比特位,我们需要构造一个掩码,其中目标比特位为0,其余位为1。这可以通过对1左移bitIndex位得到一个值,然后对其取反(~)实现。
  3. 位清除:最后,使用按位与(&)操作符将原始bitSet与构造的掩码相与,这样所有与掩码中为1对应的位保持不变,而目标位由于掩码中为0,因此被置为0。

此方法适用于包括MSB在内的任何比特位,确保了无论bitIndex为何值,都能正确地清除指定位置的比特位。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: