[英]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.