8

C でビットの順序を逆にしようとしています (宿題の質問、件名: ビット単位の演算子)。私はこの解決策を見つけましたが、使用されている 16 進値 (0x01 と 0x80) に少し混乱しています。

  unsigned char reverse(unsigned char c) {
     int shift;
     unsigned char result = 0;

     for (shift = 0; shift < CHAR_BITS; shift++) {
        if (c & (0x01 << shift))
            result |= (0x80 >> shift);
     }
     return result;
  }

私が取り組んでいる本では、これらの種類の価値について論じていないので、どうすればよいのかよくわかりません。誰かがこのソリューションに光を当てることができますか? ありがとうございました!

4

4 に答える 4

8

0x01 は最下位ビット セットであるため、10 進数値は 1 です。

0x80 は、8 ビット バイト セットの最上位ビットです。それが signed char で格納されている場合 (2 の補数表記を使用するマシン上 - あなたが遭遇する可能性が高いほとんどのマシンがそうであるように)、それは最も負の値 (10 進数 -128) です。unsigned char では、10 進数の +128 です。

もう 1 つのパターンは、すべてのビットが設定された 0xFF です。これは、符号付き文字の場合は 10 進数の -1、符号なし文字の場合は 255 です。もちろん、ビットが設定されていない 0x00 または 0 もあります。

最初のサイクルでループが行うことは、LSB (最下位ビット) が設定されているかどうかをチェックし、設定されている場合は、結果に MSB (最上位ビット) を設定します。次のサイクルでは、LSB の次をチェックし、MSB の次を設定するなどです。

| MSB |     |     |     |     |     |     | LSB |
|  1  |  0  |  1  |  1  |  0  |  0  |  1  |  1  |   Input
|  1  |  1  |  0  |  0  |  1  |  1  |  0  |  1  |   Output
|  1  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |   0x80
|  0  |  0  |  0  |  0  |  0  |  0  |  0  |  1  |   0x01
|  0  |  1  |  0  |  0  |  0  |  0  |  0  |  0  |   (0x80 >> 1)
|  0  |  0  |  0  |  0  |  0  |  0  |  1  |  0  |   (0x01 << 1)
于 2010-04-17T23:35:37.047 に答える
5

各 16 進数は 4 ビットを表すため、

  • 0x01 は、1 を書き込むのに長い道のりです。
  • 0x80 はバイナリ [1000][0000]、つまり 128 での短い書き方です。

解決策は、ビット単位の演算子を使用して値をテストおよび設定することです。

表現:

if (a & b) { ... }

'a' と 'b' の両方で同じビットが 1 の場合、'...' を実行します。

表現

c |= b

「b」のビットが 1 の場合、「c」のビットを 1 に設定します。

ループは、テストとセットのビットを下に移動します。

幸運を!

于 2010-04-17T23:39:19.757 に答える
0

0x01は 1 (1 の位の 1) を0x80意味し、128 (16 の位の 8) を意味します。これらの数値は、それぞれ 8 ビット数値の最下位ビットと最上位ビットを指します。それらをシフトすると、バイト内の個々のビットのマスクが得られます。

編集: 16 進数では、数字は 10 の累乗ではなく、16 の累乗になります。したがって、右から 1 桁目は 1 の位 (0x1 = 1)、2 桁目は 16 の位 (0x10 = 16)、3 桁目は 256 の位 (0x100 = 256) です。すぐ。

于 2010-04-17T23:36:44.427 に答える