试试这个。
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);
}