3

OpenBCIと呼ばれる新しい IoT プロジェクトに興味があります。これは基本的に、脳波やその他のバイオデータを読み取って処理するためのオープン ソースの EEG です。彼らのドキュメントでは、(RFDuino を介して) 無線で送信されたデータは 24 ビット データを送信すると主張しています。24 ビット値を 32 ビット符号付き整数に変換するには、次の Java フレンドリーな処理コードを提案します。

int interpret24bitAsInt32(byte[] byteArray) {
    int newInt = (
        ((0xFF & byteArray[0]) << 16) |
        ((0xFF & byteArray[1]) << 8) |
        (0xFF & byteArray[2])
    );

    if ((newInt & 0x00800000) > 0) {
        newInt |= 0xFF000000;
    } else {
        newInt &= 0x00FFFFFF;
    }

    return newInt;
}

ここで何が起こっているのかを正確に理解しようとしていると思います。コードの最初の宣伝文を見てみましょう:

int newInt = (
    ((0xFF & byteArray[0]) << 16) |
    ((0xFF & byteArray[1]) << 8) |
    (0xFF & byteArray[2])
);
  • 入力に ​​3 バイトがあると仮定しても安全なのはなぜですか?
  • 0xFF値の重要性は何ですか?
  • 左ビットシフト ( <<) の目的は何ですか?

2 番目のセグメントも少し謎です。

if ((newInt & 0x00800000) > 0) {
    newInt |= 0xFF000000;
} else {
    newInt &= 0x00FFFFFF;
}
  • なぜnewInt & 0x00800000ですか?の意味は何0x00800000ですか?
  • if-else上記の操作の肯定的な結果と非否定的な結果に基づいているのはなぜですか?
  • 0xFF000000との意味は何0x00FFFFFFですか?

この関数には、もっとよく理解したいハンドウェーブとマジックがたくさんあると思います!

4

1 に答える 1

8

入力に ​​3 バイトがあると仮定しても安全なのはなぜですか?

24 ビット / 8 ビット = 3 バイト

0xFF 値の意味は何ですか?

ちょっとしたマスクです。0b11111111バイナリで。この状況では、バイト値を int に変換する簡単な方法として使用されます。

左ビットシフト (<<) の目的は何ですか?

前の命令で int 値が取得されると、左に 16 ビットシフトされ、int の 3 番目のバイト (右から数えて) の位置になります。これは、MSB が最初に来るビッグエンディアン形式でバイトを格納するバイト配列によるものです。次のバイトは、2 番目のバイトの位置を占めるために 8 ビットだけシフトされます。最後のバイトは、すでに最初のバイト スポットにあるため、まったくシフトする必要はありません。

なぜ newInt & 0x00800000 なのか? 0x00800000 の意味は何ですか?

特定のバイトのMSB0x80を取得する別のビット マスクです。0x008000003 番目のバイトの MSB に対応します (つまり、byteArray[0]前のプロセスで 16 ビット左にシフトされたバイト)。これは、24 ビット値全体の MSB にも対応します。

上記の操作の肯定的な結果と非否定的な結果に基づく if-else はなぜですか?

24 ビット値の MSB が 1 か 0 かを判断すると、2 の補数表記でそれぞれ負の数か正の数かがわかります。

0xFF000000 と 0x00FFFFFF の意味は何ですか?

数値が 24 ビット表現で負の場合、2 の補数の 32 ビット値として負にする必要があるため0b11111111、OR 演算子を使用して 4 番目と最後のバイトを (0xFF) で埋める必要があります。
すでに正の値である場合、4 番目のバイトは 0x00 である可能性があり、次の 3 バイトは元の 24 ビット値と同じ0x00FFFFFFです。

于 2016-04-14T20:00:29.773 に答える