5

このコードが何をしているのかまったくわかりません。誰か説明してもらえますか?

long input;  //just here to show the type, assume it has a value stored
unsigned int output( input >> 4 & 0x0F );

ありがとう

4

3 に答える 3

16

入力を 4 ビット右にビットシフトし、下位 4 ビットでマスクします。

この 16 ビット数の例を見てみましょう: (ドットは視覚的な分離のためだけのものです)

1001.1111.1101.1001 >> 4 = 0000.1001.1111.1101

0000.1001.1111.1101 & 0x0F = 1101 (or 0000.0000.0000.1101 to be more explicit)
于 2012-09-20T15:01:08.503 に答える
3

& はビットごとの AND 演算子です。「& 0x0F」は、最初の 4 ビットを 0 で埋めたり、値の最初 (左端) の 4 ビットを無視したりするために実行されることがあります。

0x0f = 00001111. したがって、0x0f を他のビット パターンでビットごとに & 操作すると、右端の 4 ビットのみが保持され、左の 4 ビットがクリアされます。

入力の値が 01010001 の場合、&0x0F を実行すると、00000001 が得られます。これは、左の 4 ビットをクリアした後に得られるパターンです。

別の例として、これは私がプロジェクトで使用したコードです。

バイト verflag = (バイト)(bIsAck & 0x0f) | ((バージョン << 4) & 0xf0)。ここでは、パケット ヘッダー構造で使用されているため、スペースを節約するために 2 つの値を 1 つの Byte 値に結合しています。bIsAck は BOOL で、version は値が非常に小さい Byte です。したがって、これらの値は両方とも 1 つの Byte 変数に含めることができます。

結果の変数の最初のニブルにはバージョンの値が含まれ、2 番目のニブルには bIsAck の値が含まれます。バージョンの値を取得しながら4ビット>>を実行することにより、受信時に値を個別の変数に取得できます。

これがあなたが求めたものに近いことを願っています。

于 2013-09-18T09:27:55.807 に答える
2

これは、"input" の内容をビットごとに右シフトし、結果と 0x0F (1101) のビットごとの AND を実行することです。

それが何をするかは、「入力」の内容とタイプによって異なります。それはintですか?平行?文字列 (これは、最初のバイトへのポインターに対してシフトとビットごとの AND が行われていることを意味します)。

内部で何が起こっているかの詳細については、「c++ ビット単位の操作」を Google で検索してください。さらに、C/C++ の優先順位は他の多くの言語とまったく同じではないため、C++ 演算子の優先順位を確認してください。

于 2012-09-20T15:07:53.203 に答える