【问题标题】:Shifting most significant bit in long problem in java在java中的长问题中移动最高有效位
【发布时间】:2021-01-25 22:55:01
【问题描述】:

[JAVA] 从特定索引处的长变量中清除一点时,我遇到了一个小问题。

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

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

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


    return bitSet;
}

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

我在这里做错了什么?

非常感谢任何帮助!提前谢谢!!!

例子:如果你输入 524552L 它输出 264L

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

虽然它应该输出 --> 00000000000100001000

【问题讨论】:

  • "我真的无法理解这个错误..." - 什么错误?请提供minimal reproducible example,以及预期和观察到的输出。
  • 当我尝试清除 msb 时,它会输出垃圾。例如:(10000000000100001000 --> 100001000)
  • 再次,请edit您的问题并提供完整的minimal reproducible example。有输入、预期和观察到的输出。
  • 代码没问题,没有出错的情况,也可以清除msb。该示例仅显示未打印前导零,也许您想要它们?这只是一个打印问题。
  • @bambi 是的。当您使用Integer.toBinaryString() 之类的方法时,它们仅返回以第一个“1”位集开头的字符串。当然,您总是可以通过在左侧填充来修改它。

标签: java bit-manipulation


【解决方案1】:

试试这个。

public static final long setBits(final long store, final int startBitIndex, final int bitQuantity, final boolean MSBFormat, final boolean setBit)
{
        if(startBitIndex < 0 || startBitIndex > 63) throw new IndexOutOfBoundsException("startBitIndex must be at least 0 and cannot larger than 63.");
        if(bitQuantity < 0 || bitQuantity > 64) throw new IllegalArgumentException("bitQuantity must be at least 0 and cannot be larger than 64.");
        //Do not throw IndexOfOutBoundsException for bitQuantity > (64 - startBitIndex). Tolerate. Nothing's gained from that. Its binary after all.
        if(bitQuantity == 0) return store;
        if(MSBFormat && setBit) return ((startBitIndex > 31 ? store & 0xFFFFFFFF00000000L : ((((store >> 32) & 0xFFFFFFFFL) | ((0xFFFFFFFFL >> (32 - Math.min(bitQuantity, 32 - startBitIndex))) << Math.max(0, 32 - startBitIndex - bitQuantity))) << 32)) //left side
            | (startBitIndex + bitQuantity < 33 ? store & 0xFFFFFFFFL : ((store & 0xFFFFFFFFL) | ((0xFFFFFFFFL >> (32 - Math.min(bitQuantity, Math.min(32, 64 - startBitIndex)))) << Math.max(0, 32 - (bitQuantity - (32 - startBitIndex))))))); //right side
        if(MSBFormat) return ((startBitIndex > 31 ? store & 0xFFFFFFFF00000000L : ((((store >> 32) & 0xFFFFFFFFL) & ~((0xFFFFFFFFL >> (32 - Math.min(bitQuantity, 32 - startBitIndex))) << Math.max(0, 32 - startBitIndex - bitQuantity))) << 32)) //left side
            | (startBitIndex + bitQuantity < 33 ? store & 0xFFFFFFFFL : ((store & 0xFFFFFFFFL) & ~((0xFFFFFFFFL >> (32 - Math.min(bitQuantity, Math.min(32, 64 - startBitIndex)))) << Math.max(0, 32 - (bitQuantity - (32 - startBitIndex))))))); //right side
        if(setBit) return ((startBitIndex > 31 ? store & 0xFFFFFFFFL : (store & 0xFFFFFFFFL) | ((0xFFFFFFFFL >> (32 - Math.min(bitQuantity, 32 - startBitIndex))) << startBitIndex)) //right side
            | (startBitIndex + bitQuantity < 33 ? store & 0xFFFFFFFF00000000L : ((((store >> 32) & 0xFFFFFFFFL) | (0xFFFFFFFFL >> (32 - Math.min(bitQuantity, Math.min(32, bitQuantity + startBitIndex - 32))))) << 32))); //left side
        return ((startBitIndex > 31 ? store & 0xFFFFFFFFL : (store & 0xFFFFFFFFL) & ~((0xFFFFFFFFL >> (32 - Math.min(bitQuantity, 32 - startBitIndex))) << startBitIndex)) //right side
            | (startBitIndex + bitQuantity < 33 ? store & 0xFFFFFFFF00000000L : ((((store >> 32) & 0xFFFFFFFFL) & ~(0xFFFFFFFFL >> (32 - Math.min(bitQuantity, Math.min(32, bitQuantity + startBitIndex - 32))))) << 32))); //left side
}       
    
public static final long setMSBits(final long store, final int startBitIndex, final int bitQuantity)
{
    return setBits(store, startBitIndex, bitQuantity, true, true);
}

public static final long clearMSBits(final long store, final int startBitIndex, final int bitQuantity)
{
    return setBits(store, startBitIndex, bitQuantity, true, false);
}

public static final long setLSBits(final long store, final int startBitIndex, final int bitQuantity)
{
    return setBits(store, startBitIndex, bitQuantity, false, true);
}

public static final long clearLSBits(final long store, final int startBitIndex, final int bitQuantity)
{
    return setBits(store, startBitIndex, bitQuantity, false, false);
}

【讨论】:

  • 这是我见过的最复杂的方法,还请注意,OPs 的问题实际上是关于打印的位数的混淆,而不是实际实现函数@ 987654322@
  • OP 没有找到他完美的汽车的油门踏板。你在没有任何指示的情况下给了他一架航天飞机
  • Wahhaaahha... 它只是关于零填充?好吧,那就别管答案了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 2015-03-25
  • 1970-01-01
相关资源
最近更新 更多