web-dev-qa-db-ja.com

Java:長いビットが0または1であるかどうかの確認

2 ^ xを表すビットが1か0かを判断するには、どの方法を使用しますか?

68
Ande TURNER

私は使用します:

if ((value & (1L << x)) != 0)
{
   // The bit was set
}

(より少ない括弧で逃げることができるかもしれませんが、ビット単位の操作の優先順位は決して覚えていません。)

166
Jon Skeet

別の選択肢:

if (BigInteger.valueOf(value).testBit(x)) {
    // ...
}
90
finnw

私が疑問に思うのは:

  if (((value >>> x) & 1) != 0) {

  }

..値が長いかどうかは関係ないため、またはそれがそれほど明白でないために悪化する場合は、より良いです。

トムホーティン-タックライン7月7日14:16

14
Ande TURNER

使用することもできます

_bool isSet = ((value>>x) & 1) != 0;
_

編集:「_(value>>x) & 1_」と「value & (1<<x)」の違いは、xが「値」のタイプのサイズ(あなたの場合は32)よりも大きい場合の動作に依存します。

その特定のケースでは、「_(value>>x) & 1_」で値の符号を取得しますが、「value & (1<<x)」で0を取得します(xが大きすぎる場合はビット符号を取得すると便利な場合があります大)。

その場合に0を使用する場合は、「_>>>_」の代わりに「_>>_」演算子を使用できます。

したがって、「_((value>>>x) & 1) != 0_」と「_(value & (1<<x)) != 0_」は完全に同等です

12
ThibThib

nth LSB(最下位ビット)の場合、以下が機能するはずです。

boolean isSet = (value & (1 << n)) != 0;
8
Noldorin

BitSetをチェックアウトすることをお勧めします: http://Java.Sun.com/javase/6/docs/api/Java/util/BitSet.html

6
Yannick Motton

ビットシフト 右x、最下位ビットをチェックします。

4
schnaader

Javaでは次のように動作します:

if (value << ~x < 0) {
   // xth bit set
} else {
   // xth bit not set
}

valueおよびxには、intまたはlongを指定できます(同じである必要はありません)。

非Javaプログラマーの注意事項:上記の式はJavaで動作します。この言語では、ビットシフト演算子は5(または6 of long)右側のオペランドの最下位ビットこれは、式を暗黙的にvalue << (~x & 31)(またはvaluelongの場合はvalue << (~x & 63))に変換します。

Javascript:javascriptでも機能します(Javaと同様、シフトカウントの最下位5ビットのみが適用されます)。 JavaScriptでは、numberは32ビットです。

特にCでは、負のシフトカウントは未定義の動作を呼び出すため、このテストは必ずしも機能しません(ただし、コンパイラ/プロセッサの特定の組み合わせによっては動作する場合があります)。

4
rslemos

2 ^ xビットの値は「変数&(1 << x)」です

2
Artur Soler

temp intを宣言し、元の値と等しくします。次に、temp >> x回シフトして、チェックするビットが最後の位置になるようにします。次に、temp&0xfを実行して、先行するビットをドロップします。最後のビットを残しました。最後にif(y&1 == 0)、最後のビットが1の場合、0に等しく、そうでなければ1になります。それまたはif(y + 0x1 == 0)...あまりわかりません。バカにして見る

1
user1893702

誰かがビット単位の演算子にあまり慣れていない場合は、プログラムで決定するために以下のコードを試すことができます。 2つの方法があります。

1)Java言語機能を使用してバイナリ形式の文字列を取得し、特定の位置の文字を確認します

2)2で除算を続け、特定の位置でビット値を決定します。

public static void main(String[] args) {
    Integer n =1000;
    String binaryFormat =  Integer.toString(n, 2);
    int binaryFormatLength = binaryFormat.length();
    System.out.println("binaryFormat="+binaryFormat);
    for(int i = 1;i<10;i++){
        System.out.println("isBitSet("+n+","+i+")"+isBitSet(n,i));
        System.out.println((binaryFormatLength>=i && binaryFormat.charAt(binaryFormatLength-i)=='1'));
    }

}

public static boolean isBitSet(int number, int position){
    int currPos =1;
    int temp = number;
    while(number!=0 && currPos<= position){
        if(temp%2 == 1 && currPos == position)
            return true;
        else{
            temp = temp/2;
            currPos ++;
        }
    }
    return false;
}

出力

binaryFormat=1111101000
isBitSet(1000,1)false
false
isBitSet(1000,2)false
false
isBitSet(1000,3)false
false
isBitSet(1000,4)true
true
isBitSet(1000,5)false
false
isBitSet(1000,6)true
true
isBitSet(1000,7)true
true
isBitSet(1000,8)true
true
isBitSet(1000,9)true
true
1
Kaushik Lele

私の貢献-前のものを無視

public class TestBits { 

    public static void main(String[] args) { 

        byte bit1 = 0b00000001;     
        byte bit2 = 0b00000010;
        byte bit3 = 0b00000100;
        byte bit4 = 0b00001000;
        byte bit5 = 0b00010000;
        byte bit6 = 0b00100000;
        byte bit7 = 0b01000000;

        byte myValue = 9;                        // any value

        if (((myValue >>> 3) & bit1 ) != 0) {    //  shift 3 to test bit4
            System.out.println(" ON "); 
        }
    } 
}

ビット操作の一部を実行する小さな静的クラスをコーディングしました。

public final class Bitfield {

  private Bitfield() {}

  // ********************************************************************
  // * TEST
  // ********************************************************************

  public static boolean testBit(final int pos, final int bitfield) {
      return (bitfield & (1 << pos)) == (1 << pos);
  }

  public static boolean testNum(final int num, final int bitfield) {
      return (bitfield & num) == num;
  }

  // ********************************************************************
  // * SET
  // ********************************************************************

  public static int setBit(final int pos, final int bitfield) {
     return bitfield | (1 << pos);
  }

  public static int addNum(final int number, final int bitfield) {
      return bitfield | number;
  }

  // ********************************************************************
  // * CLEAR
  // ********************************************************************

  public static int clearBit(final int pos, final int bitfield) {
      return bitfield ^ (1 << pos);
  }

  public static int clearNum(final int num, final int bitfield) {
      return bitfield ^ num;
  }

  }

飛び回る質問があれば、私にメールを書いてください。

良いプログラミング!

0