我试图找到一种在整数或短值内设置多个位的简单方法。
对于短值,我想设置5位,从第6位开始。 我想要设置的值是一个特定的值,我可以存储在一个字节或短或任何其他。
对于Java SetBits,我没有看到任何可以做这样的事情。 似乎应该很容易做到这一点。
除了一次设置一个位或类似的东西之外,有没有人知道这样做的简单方法?
答案 0 :(得分:0)
简单的方法是使用按位运算。例如,假设位从右开始编号为零,则将5位设置为从偏移6开始的位。
int target = ...
target = target | 0x07b0; // that is 00000 0111 1100 0000
或者如果您使用的是Java 8:
target = target | 0b00000 0111 1100 0000;
如果要将相同的位设置为从变量获得的值,则...
int target = ...
int value = ...
int temp = target & ( ~ 0b00000 0111 1100 0000 ); // clear current bit values
target = temp & ( value << 6 ); // set the new values.
涉及低级位变换的代码是混乱和不透明的,但双向运算符(和移位运算符)的逻辑很简单。如果你在生产代码中这样做,那么我强烈建议你定义一堆具有语义相关名称的常量,并使用它们而不是整数。
我希望有一个内置的Java方法......
没有一个,AFAIK。但是,如果您认为它会使编码更简单,您可以轻松编写和测试自己的位操作方法。 (问题是这样的API可能不会提高代码的可读性......并且JIT编译器可能难以优化生成的代码。)
答案 1 :(得分:0)
您可以在Java中使用二进制文字:
// An 8-bit 'byte' value:
byte aByte = (byte)0b00100001;
// A 16-bit 'short' value:
short aShort = (short)0b1010000101000101;
// Some 32-bit 'int' values:
int anInt1 = 0b10100001010001011010000101000101;
int anInt2 = 0b101;
int anInt3 = 0B101; // The B can be upper or lower case.
// A 64-bit 'long' value. Note the "L" suffix:
long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;
更多here