簡體   English   中英

在java中移動長問題中的最高有效位

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

[JAVA] 我有一個小問題,當從特定索引的長變量中清除一點時。

該方法幾乎適用於所有情況,但是當我嘗試清除(設置為 0)msb(最高有效位)時失敗。

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

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


    return bitSet;
}

我真的無法理解這個錯誤......

我在這里做錯了什么?

任何幫助是極大的贊賞! 提前致謝!!!

示例:如果您輸入 524552L,則輸出 264L

二進制(同一個例子):10000000000100001000 --> 100001000

雖然它應該輸出 - > 00000000000100001000

嘗試這個。

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