Java:長い時間にビットが0または1かどうかを確認する
-
11-09-2019 - |
質問
2^xを表すビットが1または0であるかどうかを判断するために、どのような方法を使用しますか?
解決
私は使用します:
if ((value & (1L << x)) != 0)
{
// The bit was set
}
(より少ないブラケットで逃げることができるかもしれませんが、ビットワイズ操作の優先順位を覚えていません。)
他のヒント
別の選択肢:
if (BigInteger.valueOf(value).testBit(x)) {
// ...
}
かしら:
if (((value >>> x) & 1) != 0) {
}
..価値が長いかどうかは関係ないので、またはそれほど明白ではないために悪いかどうかは優れています。
トム・ホーティン - タックライン7月7日14:16
使用することもできます
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
「完全に同等です
のために n
Th LSB(最小重要なビット)、以下は機能するはずです。
boolean isSet = (value & (1 << n)) != 0;
ビットセットをチェックしてください: http://java.sun.com/javase/6/docs/api/java/util/bitset.html
ビットシフト Xのすぐそばで、最低ビットをチェックします。
Javaでは、次の動作が正常に機能します。
if (value << ~x < 0) {
// xth bit set
} else {
// xth bit not set
}
value
と x
可能です int
また long
(そして同じである必要はありません)。
Java以外のプログラマーに対する注意の言葉: :前述の式はJavaで機能します。なぜなら、その言語では、ビットシフト演算子は5(または6の場合にのみ適用されるためです。 long
)右側のオペランドの最低ビット。これは、式を暗黙的に変換します value << (~x & 31)
(また value << (~x & 63)
もしも value
は long
).
JavaScript: :JavaScriptでも動作します(Javaと同様に、最低5ビットのシフトカウントのみが適用されます)。 JavaScriptで number
32ビットです。
特にCでは、ネガティブシフトカウントは未定義の動作を呼び出すため、このテストは必ずしも機能するとは限りません(ただし、コンパイラ/プロセッサの特定の組み合わせによって異なります)。
2^xビットの値は「変数&(1 << x)」です。
温度を宣言し、オリジナルに等しくします。次に、温度をシフト>> x時間、チェックしたいビットが最後の位置になるようにします。次に、TEMP&0XFを実行して、前のビットをドロップします。今最後のビットが残っています。最後に、(y&1 == 0)、最後のビットが1の場合、それは0に等しくなり、それ以外は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
私の貢献 - 以前のものを無視します
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;
}
}
飛び回っている質問がいくつかある場合は、メールを書いてください。
良いプログラミング!
ビットシフとその複雑さを排除し、aを使用します lut 右のために and
オペランド。