1. ホーム
  2. c

[解決済み] C言語のビット演算において、0x01と0x80は何を表しているのですか?

2022-01-28 09:54:02

質問

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;
  }

書籍 私はこの種の値について議論したことがないので、どうしたらいいのかよくわからないのです。 どなたか、この解決策に光を当てていただけませんか? ありがとうございます。

どのように解決するのですか?

0x01は最下位ビットが設定されているため、10進数で1が表示されます。

0x80は8ビットバイトセットの最上位ビットです。 符号付き文字列の場合(2の補数表記を使用するマシン(ほとんどのマシンがそうです))、最も負の値(10進数-128)となり、符号なし文字列の場合は10進数+128になります。

符号付き文字の場合は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)