2

一度に1つずつ、ビット演算を使用してchar(8ビット)を作成しようとしてhexいます。私が実行しているマシンはリトルエンディアンです。

とにかく、例えば:

char buff;
buff = 0x54; // ('T')
printf(" %c \n", buff ); // prints T

buff |= 0x54;        // Produces the same result.
buff |= 0x50 | 0x04; // Produces the same result.

0x5しかし、とでビットシフトを使用して上記を作成できるはず0x4です。

私はもう試した

buff = ((buff << 4) | 0x4) | (buff | 0x5);

そしてその変種ですが、進歩はありません。シンプルなものが欠けている気がします。

編集:解決しました。

皆さんありがとう。何をシフトするかを言わずにシフトできるなんて知らなかった*?

  • 「buff=0x5 << 4 | 0x4」について完全に理解していない可能性があります。正しく解釈すると、4が左にシフトし、0x5を設定してから、ORと4を設定しますか?** 気にしない。以下のマイクはそれが何をしたかを徹底的に説明しました。すべてに感謝します。
4

5 に答える 5

2

これらの手順を組み合わせることができますが、内訳は次のとおりです。

char buff = 0x5;  // set the upper nibble of the byte
buff <<= 4;       // shift it over to the left
buff |= 0x4;      // OR in the lower nibble
printf("%x\n", buff);  // result here is 0x54

お使いのバージョンが機能しなかった理由:

buff = ((buff << 4) | 0x4) ... // start on the left, you shifted nothing 
                               // (if we assume 0 was the starting value). So this 
                               // is just going to be 0x4
buff = (0x4) | (buff | 0x5); // again, if we assume buff is 0 then this becomes 0x5
buff = 0x4 | 0x5;            // (that's 0100 | 0101 which gives you 0x5)
于 2013-03-26T15:16:58.713 に答える
1

シフトがどのように機能するかについて少し混乱しているようです。シフトされていない定数の前または次の目的地をシフトしようとしているからです。

必要なのは:

buff = (5 << 4) | 4;

これらの定数を16進数にすることに特に意味はありませんが、もちろん、それぞれが4ビット(1桁の16進数)であると想定されているため、長くなりますが、一種の意味があります。

buff = (0x5 << 4) | 0x4;

ちなみに、「4ビットのデータ」の名前はニブル(0.5バイトですよね?)で、「1つの16進数」はほとんど意味がありません。

于 2013-03-26T15:15:50.100 に答える
1

コードではbuf、次のように式での値を使用しないでください。

char buff = ((0x05 << 4) | 0x4);

上記の式はコンパイル時定数であることに注意してください。つまり、((0x05 << 4) | 0x4)計算はターゲットシステムのCPUではなく、コンパイラによって実行されます。

または、次のように複数の行で実行できます。

char buff = 0x00;
buff |= 0x05;
buff <<= 4;
buff |= 0x04;
于 2013-03-26T15:15:56.880 に答える
0

上記の「バフ」に相当するものは次のとおりです。

buff = (0x5 << 4) | 0x4;
于 2013-03-26T15:15:48.277 に答える
0

最初の桁を4だけ左にシフトし、次に2番目の桁をシフトします

 int first = 5;
 int second = 4;
 buff = (first << 4) | second;
于 2013-03-26T15:16:30.350 に答える