29

Javaでlongの特定の位置にビットを設定/設定解除する方法は?

例えば、

long l = 0b001100L ; // bit representation

ビットを位置2に設定し、ビットを位置3に設定解除したいので、対応するlongは、

long l = 0b001010L ; // bit representation

誰かが私にそれをする方法を手伝ってもらえますか?

4

5 に答える 5

74

ビットを設定するには、次を使用します。

x |= 0b1; // set LSB bit
x |= 0b10; // set 2nd bit from LSB

少し使用を消去するには:

x &= ~0b1; // unset LSB bit (if set)
x &= ~0b10; // unset 2nd bit from LSB

少し使用を切り替えるには:

x ^= 0b1;

0b? を使用していることに注意してください。次のように、任意の整数を使用することもできます。

x |= 4; // sets 3rd bit
x |= 0x4; // sets 3rd bit
x |= 0x10; // sets 9th bit

ただし、どのビットが変更されているかを知るのが難しくなります。

バイナリを使用すると、正確にどのビットが設定/消去/切り替えられるかを確認できます。

ビットを動的に設定するには、次を使用します。

x |= (1 << y); // set the yth bit from the LSB

(1 << y)...001 y 桁左にシフトするため、セット ビットを y 桁移動できます。

一度に複数のビットを設定することもできます:

x |= (1 << y) | (1 << z); // set the yth and zth bit from the LSB

または設定を解除するには:

x &= ~((1 << y) | (1 << z)); // unset yth and zth bit

または切り替えるには:

x ^= (1 << y) | (1 << z); // toggle yth and zth bit
于 2012-08-18T03:35:10.213 に答える
8

最下位ビット (lsb) は通常ビット 0 と呼ばれるため、「位置 2」は実際には「ビット 1」です。

long x = 0b001100;  // x now = 0b001100
x |= (1<<1);        // x now = 0b001110 (bit 1 set)
x &= ~(1<<2);       // x now = 0b001010 (bit 2 cleared)
于 2012-08-18T03:45:21.963 に答える
3

これにはBigIntegerを選択します...

class Test {
    public static void main(String[] args) throws Exception {
        Long value = 12L;
        BigInteger b = new BigInteger(String.valueOf(value));
        System.out.println(b.toString(2) + " " + value);
        b = b.setBit(1);
        b = b.clearBit(2);
        value = Long.valueOf(b.toString());
        System.out.println(b.toString(2) + " " + value);
    }
}

そしてここに出力があります:

1100 12
1010 10
于 2012-08-18T04:09:36.163 に答える
-1

あなたのために仕事をするクラスjava.util.BitSetを見てください。

設定するには:myByte.set(bit); リセットするにはmyByte.clear(bit); : ブール値を入力するには:myByte.set(bit, b); ブール値を取得するには:b = myByte.get(bit);

于 2015-05-22T08:50:41.453 に答える
-1
  • long をビットセットに変換する
  • 必要なビットを設定します
  • ビットセットを long に戻す

long をビットセットに、またはその逆に変換する方法については、この投稿BitSet to and from integer/longを参照してください。

于 2012-08-18T03:52:29.410 に答える