2011-01-18 4 views
1

文字列で受け取ったバイナリデータを解析しようとしています。私はビット単位の操作に慣れていません。2つの符号なしshortを分割する方法

文字列内のバイト(符号なしのショートとみなす)の1つに、2つの重要な数字が含まれています。バージョンとカウントです。 ビット1〜4にはバージョンが含まれ、ビット5〜8にはカウントが含まれます。

私はunsigned shortのデータを持っていますので、必要な2つの情報が入っている2つのunsigned shortを得るにはどうすればいいですか?

bit: 1_2_3_4_5_6_7_8_

con: VERSION_COUNT___

+0

「ビット5〜8にはカウントが含まれていますか」 – Thomson

+1

unsigned shortsは通常16ビットですが、intより大きくない限り長くてもかまいません。 – CashCow

答えて

2

Shiftキーと実行AND演算。

int version = value & 0xF; 
int count = (value >> 4) & 0xF; 

またはその逆。数字としてビットは右から左である - 7-6-5-4-3-2-1-0

+2

ビットに番号を付ける普遍的な方法はありません。http://en.wikipedia.org/wiki/Bit_numbering –

+0

C言語であり、C++で継承されています。 '' ''と '' << '演算子は、それを視覚的に明確にします。 '1 << 3」は3つの位置に1つずつシフトされます。 '1 << 3 == 8」なので、ビットは左から数えられることが分かっています。同様に、 '128 >> 3 == 16'です。 – MSalters

+1

@MSaltersシフト演算子はビットの番号付け方法を定義せず、Cは特定のビットを番号で参照する方法を提供しません。したがって、1のバイナリ表現が00000001であり、8が00001000であることはわかっていますが、00000001に設定されているビットを "ビット0"、 "ビット7"、または "ビット8"ビットナンバリングは、一般的にはドキュメントではなく、コードではありません。ビットアドレス可能なアーキテクチャはあまりなく、(ウィキペディアの記事では)「ビットナンバリングは通常、ソフトウェアに対して透過的です。 –

1
unsigned short part1 = data & 0xF; // bits 0..3 
unsigned short part2 = (data >> 4) & 0xF; // bits 4..7 
1

Iは、二つの情報(バージョンとカウント)は、2つのニブルのペアとして格納されていることを理解します(4ビットの部分)を1バイトに変換するので、unsigned shortの代わりにunsigned charの型を考えると思います(この場合、2バイトに分割します)。

ケース1:バージョンが上位ニブル(ビット4-7)で、カウントが下位ニブル(ビット0-3)

unsigned char ver = c >> 4; 
unsigned char count = (c & 0x0f); 

でこれが正しければ、私たちは、ニブルがパックされている方法の2例を持っていますケース2:

unsigned char c; 
:カウントが高いニブル(ビット4~7)とバージョンが下位ニブル(ビット0-3)は、Cが情報を含むバイトであり、以下のように宣言され

unsigned char count = c >> 4; 
unsigned char ver = (c & 0x0f); 

であります

であり、最下位ビットのビット番号はゼロから始まります。

0
unsigned short version = (unsigned short)(data & 0x0F); 

unsigned short count = (unsigned short) (data >> 4); 
関連する問題