4

私はビットを扱うのは初めてです。3つの異なるタイプのメッセージを送信できる既存のプロトコルを使用しようとしています。

タイプ1は16ビット構造です。

struct digital 
{
 unsigned int type:2;
 unsigned int highlow:1;
 unsigned int sig1:5;
 unsigned int :1;
 unsigned int sig2:7;
};

最初の2ビット(上記の私の構造ではタイプ)は常に10です。3番目のビットhighlowは、信号がオンかオフかを決定し、sig1+sig2が一緒になって信号の12ビットインデックスを定義します。このインデックスは、常にビット7にある0によって2バイトに分割されます。

タイプ2は32ビット構造です。2ビットタイプ、10ビットインデックス、16ビット値があり、27、23、15、7の位置に0が点在しています。ビットフィールド構造体表現は次のようになります。

struct analog 
{
 unsigned int type:2;
 unsigned int val1:2;
 unsigned int :1;
 unsigned int sig1:3;
 unsigned int :1;
 unsigned int sig2:7;
 unsigned int :1;
 unsigned int val2:7;
 unsigned int :1;
 unsigned int val3:7;
};

sig1とsig2が一緒になって10ビットのインデックスを形成します。val1 + val2 + val3は一緒になって、10ビットインデックスで信号の16ビット値を形成します。

最初の2つの構造体の操作方法を理解すれば、3番目の構造体を理解できると思います。

私の質問は、単一の値を割り当てて、プログラムにval1、val2、およびval3に入る必要のあるビットを処理させる方法はありますか?

ビットシフト、ビットフィールド構造体、および0によるパディングについて読みました。構造体は進むべき道のように見えますが、それを実装する方法がわかりません。私が見たビットパッキングの例のどれも、これらのように分割された値を持っていません。最終的には、アナログ構造体を作成し、インデックス(i = 252)と値(v = 32768)を割り当てて、それを実行できるようにしたいと思います。

誰かが適切な方法を提案したり、同様のサンプルへのリンクを提供したりできれば、私はそれを大いに感謝します。重要な場合、このコードはより大きなObjective-Cアプリに組み込まれます。

ありがとう。

ブラッド

4

3 に答える 3

4

一連のシフト、ands、およびorsでそれを行うことができます。タイプ 2 の 10 ビット インデックス部分を実行しました。

unsigned int i = 252;

analog a = (analog)(((i << 16) & 0x7f0000) | (i << 17) & 0x7000000);

基本的に、このコードが行うことは、対象の 10 ビットをint i16 ~ 25 の範囲にシフトandし、ビットマスク0x7f0000を使用してビット 22 ~ 31 をゼロに設定することです。また、10 ビットの別のコピーを 17 ~ 26 の範囲にシフトandし、ビットマスク0x7000000を使用してビット 0 ~ 22 および 26 ~ 31 をゼロに設定します。次にor、2 つの値を組み合わせて、目的のゼロ区切り値を作成します。

.. ビットマスクを正しくカウントしたかどうかは完全にはわかりませんが、理解していただければ幸いです。shift、and-mask、or-merge だけです。

編集:方法2:

analog a;
a.sig1 = (i & 0x7f); // mask out bit 8 onwards
a.sig2 = ((i<<1) & 0x700); // shift left by one, then mask out bits 0-8

よく考えてみると、方法 2 の方が読みやすいので、おそらくこれを使用する必要があります。

于 2009-11-25T15:30:27.303 に答える
1

ビットフィールドの物理的なレイアウトは定義されていないため、C 構造体のビットフィールドは使用しないでください。コンパイラが何をしているのかを把握し、レイアウトを基になるデータと一致させることはできますが、別のコンパイラに切り替えたり、コンパイラを更新したりすると、コードが機能しない可能性があります。

面倒だとは思いますが、ビット操作は自分で行ってください。

于 2009-11-26T06:22:59.677 に答える
0

これを行う必要はありません。これがユニオン キーワードの出番です。すべてのビットを同時に指定するか、別の名前で同じビットを参照することで、一度にすべてを設定できます。

于 2009-11-25T17:36:24.913 に答える