web-dev-qa-db-ja.com

バイトから特定の位置にあるビットの値を取得する方法は?

バイトがある場合、メソッドは特定の位置でビットを取得するためにどのように見えるでしょうか?

これが私が知っていることであり、私はそれが機能するとは思わない。

public byte getBit(int position) {
    return (byte) (ID >> (position - 1));
}

ここで、IDは、情報を取得するバイトの名前です。

44
Glen654
public byte getBit(int position)
{
   return (ID >> position) & 1;
}

IDを位置ごとに右にシフトすると、ビット#positionが数値の右端になります。それとビット単位のAND &が1の場合、ビットが設定されているかどうかがわかります。

position = 2
ID = 5 = 0000 0101 (in binary)
ID >> position = 0000 0001

0000 0001 & 0000 0001( 1 in binary ) = 1, because the furthest right bit is set.
90
Hunter McMillen

ビットマスクを作成し、ビット単位で処理します。それはあなたが持っているものに非常に近いものになります-shiftを使用して適切なビットを設定し、&を使用してビット単位の操作を行います。

そう

 return ((byte)ID) & (0x01 << pos) ;

posの範囲は0から7です。「ビット1」として最下位ビットがある場合は、-1が必要ですが、これに反対することをお勧めします。位置は常に私にとってエラーの原因です。

8
Charlie Martin

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

1
rslemos

整数のn番目のビットを取得する

 return ((num >> (n-1)) & 1);
1
src3369