1

16 進数のものが 2 つある場合、バイナリを一緒に追加して値を取得する方法はありますか?

C ++では、私が持っているとしましょう

unsigned char t = 0xc2;  // 11000010
unsigned char q = 0xa3;  // 10100011

私が欲しいのはどういうわけかです 1100001010100011、これはビット単位の演算子を使用して可能ですか?

t と q のバイナリ形式を抽出して追加したい...

4

6 に答える 6

20

はい、可能です。

少なくとも 16 ビットの整数を使用して、左に 8 だけシフトする左ビットシフト演算子を使用するだけです。次に、2 番目の値を整数にバイナリ OR します。

unsigned char t = 0xc2; // 11000010 
unsigned char q = 0xa3; // 10100011
unsigned short s = (((unsigned short)t)<<8) | q; //// 11000010 10100011

あるいは、両方の値を 2 文字を含む共用体に入れる (ビッグ エンディアンまたはスモール エンディアンに注意してください) と、同じビット レベルの結果が得られます。別のオプションは char[2] です。

于 2008-11-02T18:52:02.887 に答える
1

2 つの文字を連結する:

unsigned char t = 0xc2;  // 11000010
unsigned char q = 0xa3;  // 10100011

int result = t;  // Put into object that can hold the fully concatenated data;
result <<= 8;     // Shift it left
result |= q;     // Or the bottom bits into place;
于 2008-11-02T18:53:25.553 に答える
0

入力値の幅 (通常は 8 ビット) が定義されていないため、この例はあまりうまく機能しません。たとえば、なぜあなたの例ではないのですか: 0000000100000010、これは本当に 1 (00000001) と 2 (00000010) ビット単位で追加されます。

各値の幅が固定されている場合はビット シフトと値の OR で答えることができます。

編集:「幅」が先行ゼロをすべて削除した全幅で定義されている場合、シフトと ORing を行うことができますが、より複雑です。

于 2008-11-02T18:25:56.920 に答える
0

char配列を使用します。

unsigned short s; char * sPtr = &s; sPtr[0] = t; sPtr[1] = q;

これはエンディアンをあまり気にしません..なぜこれをやりたいのかわかりませんが、これはうまくいきます。

ビット メソッドの問題は、取得したサイズがわからないことです。あなたがサイズを知っていれば..私はブライアンの答えに行きます

于 2008-11-02T21:31:28.527 に答える
-2

数値を扱っているため、2 進数/16 進数に追加はありません (1 と 2 を追加して、結果の 12 を「実際の」12 と混同しないようにすることはできますか?)

それらを特別な記号で区切ることはできますが、単に「連結」することはできません。

于 2008-11-02T18:22:15.583 に答える
-2

操作として追加することは、数値がどのベースにあるかに関係なく、実際には意味がありません。連結演算子として:あなたの例では、 0x1 。0x2 は 16 進数を連結すると 0x12 になり、2 進数を連結すると 0b101 になります。しかし、0x12 と 0b101 は同じ値ではありません (基数 10 では、それぞれ 18 と 5 です)。一般に、AOB (A と B は数値、O は演算子) は、操作している基数に関係なく同じ値になります。

于 2008-11-02T18:27:18.943 に答える