2016-05-01 1 views
-1

私はCの初心者です。ビット操作にいくつかの問題があります。すでにビット操作の探索を探しています。私のコードでは間違いを検出できません。bitoperationsをC言語で正しく使うには

この作業では、2つの列挙型のデータを16ビットのint値にシリアル化および逆シリアル化します。

typedef enum { 
Stop = 0, 
Start = 1, 
Finish = 5, 
Fail = 255 
} Status; 

typedef enum { 
One = 1, 
Fifteen = 15, 
Last = 255 
} Numbers; 

列挙ステータスのデータは、下位バイトに保存し、列挙番号のデータは上位バイトに保存する必要があります。 だから私のシリアル化機能は、次のようになります。

void serialize(Status s, Numbers n, short int* data) { 
*data = (unsigned) n<<8; 
*data = (unsigned) (*data|s); 
} 

私のデシリアライズ機能は次のようになります。

void deserialize(unsigned short int data, Status* s, Numbers* n) { 
*s = (unsigned) data<<8; 
*s = (unsigned) *s>>8; 
*n = (unsigned) data>>8; 
} 

問題は今、私はこのtestfunctionを実行すると、それは常に失敗呼び出すことです。

void testSD(Status s, Numbers n) { 
unsigned short int data; 
Status s2; 
Numbers n2; 
serialize(s, n, &data); 
deserialize(data, &s2, &n2); 
if(s2 == s && n2 == n) { 
printf("succsess \n"); 
} 
else { 
printf("fail \n"); 
} 
} 

私は教授から得たので、テスト関数は正しいです。 serialize機能で

+0

'short int * data'は署名されているはずですか?私はちょっとそれを疑うよ。 – WhozCraig

答えて

0

dataが指し示すデータはその後

+--------+--------+ 
|nnnnnnnn|ssssssss| 
+--------+--------+ 

ようになり、deserialize関数は次のように機能します。

*s = (unsigned) data<<8;

 +--------+--------+--------+ 
*s = |nnnnnnnn|ssssssss|00000000| 
    +--------+--------+--------+ 

*s = (unsigned) *s>>8;

 +--------+--------+ 
*s = |nnnnnnnn|ssssssss| 
    +--------+--------+ 

*n = (unsigned) data>>8;

 +--------+ 
*n = |nnnnnnnn| 
    +--------+ 

したがって、*sの値が間違っなります。あなたのデシリアライズ機能が正しくない

void deserialize(unsigned short int data, Status* s, Numbers* n) { 
    *s = (unsigned) data & 0xff; 
    *n = (unsigned) data>>8; 
} 
+0

ありがとう、私は私の失敗を参照してください。これは多くの助けとなりました。良い一日を。 –

0

deserializeは次のようなものでなければなりません。

status = 5、number = 1とします。

データの値がデシリアライズで

0105(16進数)

なり、あなたはnと番号を取得>> 8、下部をシフトアウトし、1の値を有しますので、どちらが正しい。

状況については

、あなたは現在8でそれをシフトしているので、それが戻ってダウンし、それをシフトその後、010500(16進数)とある0150あなたが本当にしたいことは一般的にされるであろう、ちょうど下位8ビットである

(16進数)値を0xFFと論理積することによって行われます。

すなわち:0105 &は0xFF = 05

そうにステータス用のデシリアライズの一部変更:

*のS =データ&は0xFFを、

関連する問題