24

バイトから n ビットを取得するのに少し問題があります。

符号なし整数があります。16 進数の数値が 0x2A であるとしましょう。これは 10 進数で 42 です。バイナリでは、0010 1010 のようになります。最初の 5 ビットである 00101 と次の 3 ビットである 010 を取得し、それらを別々の整数に配置するにはどうすればよいでしょうか?

誰かが私を助けることができれば、それは素晴らしいことです! 単純に1バイトから抽出する方法を知っています

int x = (number >> (8*n)) & 0xff // n being the # byte

スタックオーバーフローに関する別の投稿で見ましたが、バイトから個別のビットを取得する方法がわかりませんでした。誰かが私を助けることができれば、それは素晴らしいことです! ありがとう!

4

6 に答える 6

27

整数は、マシン内で一連のビットとして表されます。私たち人間にとって幸いなことに、プログラミング言語はこれらの数値を 10 進数 (または 16 進数) で表示するメカニズムを提供しますが、それによって内部表現が変更されることはありません。

このような問題を解決する方法を理解するのに役立つ、ビットごとの演算子&|^および~シフト演算子<<およびを修正する必要があります。>>

整数の最後の 3 ビットは次のとおりです。

x & 0x7

最後の 8 ビットから始まる 5 ビットは次のとおりです。

x >> 3    // all but the last three bits
  &  0x1F // the last five bits.
于 2013-03-06T19:05:41.103 に答える
19

C での整数型の部分の「グラブ」は、次のように機能します。

  1. 必要なビットを最も低い位置にシフトします。
  2. 必要なビットをマスクするために使用&します。1 は「このビットをコピーする」ことを意味し、0 は「無視する」ことを意味します。

だから、あなたの例では。数があるとしましょうint x = 42;

最初の 5 ビット:

(x >> 3) & ((1 << 5)-1);

また

(x >> 3) & 31;

下位 3 ビットをフェッチするには、次のようにします。

(x >> 0) & ((1 << 3)-1)

また:

x & 7;
于 2013-03-06T19:06:06.980 に答える
10

hi上からのビットと下からのビットが必要だとしloます。(あなたの例では5と3)

top = (n >> lo) & ((1 << hi) - 1)
bottom = n & ((1 << lo) - 1)

説明:

topについては、最初に下位ビットを取り除き (右にシフト)、次に残りを「すべて 1」のマスクでマスクします ( のような 2 進数がある場合0010000、1 つの結果を減算します0001111- あなたが持っていたのと同じ数の1s 0-s元の番号で)。

ボトムについても同じですが、最初のシフトを気にする必要はありません。

top = (42 >> 3) & ((1 << 5) - 1) = 5 & (32 - 1) = 5 = 00101b
bottom = 42 & ((1 << 3) - 1) = 42 & (8 - 1) = 2 = 010b
于 2013-03-06T19:06:00.430 に答える
8

これにはビットフィールドを使用できます。ビットフィールドは、変数をビット単位で指定できる特別な構造体です。

typedef struct {
  unsigned char a:5;
  unsigned char b:3;
} my_bit_t;

unsigned char c = 0x42;
my_bit_t * n = &c;
int first = n->a;
int sec = n->b;

ビット フィールドの詳細については、http: //www.cs.cf.ac.uk/Dave/C/node13.html#SECTION001320000000000000000 を参照してください。

ビットフィールドの魅力は、シフト演算子などを扱う必要がないことです。表記法は非常に簡単です。いつものように、ビットの操作には移植性の問題があります。

于 2013-03-06T20:20:12.157 に答える
2

int x = (number >> 3) & 0x1f;

numberは、最後の 5 ビットが の 8 ~ 4 ビットで、残りのビットがゼロの整数を返します。

同様に、

int y = number & 0x7;

最後の 3 ビットが の最後の 3 ビットに設定さnumberれ、残りのゼロが設定された整数が得られます。

于 2013-03-06T19:05:44.777 に答える
1

コード内の 8* を取り除くだけです。

int input = 42;
int high3 = input >> 5;
int low5 = input & (32 - 1); // 32 = 2^5
bool isBit3On = input & 4; // 4 = 2^(3-1)
于 2013-03-06T19:03:47.680 に答える