简体   繁体   English

在java中移动长问题中的最高有效位

[英]Shifting most significant bit in long problem in java

[JAVA] I have a small problem, when clearing a bit from a long variable at a specific index. [JAVA] 我有一个小问题,当从特定索引的长变量中清除一点时。

The method works fine for nearly everything, but fails when i try to clear(set to 0) the msb (most significant bit).该方法几乎适用于所有情况,但是当我尝试清除(设置为 0)msb(最高有效位)时失败。

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

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


    return bitSet;
}

I really cant wrap my head around this error...我真的无法理解这个错误......

What am I doing wrong here?我在这里做错了什么?

Any help is greatly appreciated!任何帮助是极大的赞赏! Thanks in advance!!!提前致谢!!!

Example: if you put in 524552L it outputs 264L示例:如果您输入 524552L,则输出 264L

in binary(same example): 10000000000100001000 --> 100001000二进制(同一个例子):10000000000100001000 --> 100001000

although it should output -- > 00000000000100001000虽然它应该输出 - > 00000000000100001000

Try this.尝试这个。

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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM