有没有简单的方法可以在short或int中连续设置几个位?

时间:2015-01-09 23:21:51

标签: java

我试图找到一种在整数或短值内设置多个位的简单方法。

对于短值,我想设置5位,从第6位开始。 我想要设置的值是一个特定的值,我可以存储在一个字节或短或任何其他。

对于Java SetBits,我没有看到任何可以做这样的事情。 似乎应该很容易做到这一点。

除了一次设置一个位或类似的东西之外,有没有人知道这样做的简单方法?

2 个答案:

答案 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