79

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

4

14 に答える 14

186

私は使用します:

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

(かっこの数を減らしても解決できるかもしれませんが、ビット演算の優先順位は覚えていません。)

于 2009-07-07T13:42:54.307 に答える
101

別の方法:

if (BigInteger.valueOf(value).testBit(x)) {
    // ...
}
于 2009-07-07T14:05:00.923 に答える
15

かしら:

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

  }

.. 値が長いかどうかは問題ではないため、より優れています。

Tom Hawtin - タックライン 7 月 7 日 14:16

于 2009-07-15T10:26:53.313 に答える
13

使用することもできます

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

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

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

その場合に 0 を使用したい場合は、代わりに " " 演算子を使用できます>>>>>

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

于 2009-07-07T13:46:24.147 に答える
8

n番目の LSB (最下位ビット) については、次のように動作するはずです。

boolean isSet = (value & (1 << n)) != 0;
于 2009-07-07T13:43:46.427 に答える
7

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

于 2009-08-29T11:56:19.067 に答える
4

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

于 2009-07-07T13:44:05.333 に答える
2

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

于 2009-07-07T13:43:56.880 に答える
1

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

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 "); 
        }
    } 
}
于 2012-09-28T23:27:51.480 に答える
1

ビット単位の演算子に慣れていない場合は、以下のコードを試してプログラムで決定できます。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
于 2014-06-14T10:12:55.183 に答える
0

temp int を宣言し、オリジナルと等しくします。次に、temp >> x回シフトして、チェックしたいビットが最後の位置になるようにします。次に、temp & 0xf を実行して、前のビットをドロップします。最後のビットを残しました。最後に if (y & 1 == 0) を実行します。最後のビットが 1 の場合、それは 0 に等しいはずです。それ以外の場合は 1 になります。ふざけて見てください

于 2012-12-17T18:45:53.090 に答える
-2

ビットシフトとその複雑さを排除し、右側のオペランドにLUTを使用します。and

于 2009-08-30T15:00:28.420 に答える