質問は基本的なものでなければなりませんが、私は今それを得るのにいくつかの問題があったことに驚いています。最初の1つは、「C++入門書」の本の5.3章を一瞥したときです。ビット単位演算子、作成者がシフト操作を説明するための例として以下のコードを使用する場合:
unsigned char bits = 1; // '10011011' is the corresponding bit pattern
bits << 1; // left shift
これを見ると頭が少し回転しますが、「10011011」はどこから来たのですか?「1」は「0x01」ではありませんか?
別の質問はhttp://c-faq.com/strangeprob/ptralign.htmlから来ています。ここで、作成者は構造を解凍しようとします。
struct mystruct {
char c;
long int i32;
int i16;
} s;
を使用して
unsigned char *p = buf;
s.c = *p++;
s.i32 = (long)*p++ << 24;
s.i32 |= (long)*p++ << 16;
s.i32 |= (unsigned)(*p++ << 8); // this line !
s.i32 |= *p++;
s.i16 = *p++ << 8;
s.i16 |= *p++;
私の質問は、pはunsigned char(8ビット)へのポインタですよね?s.i32(24〜31、16〜23)の上位バイトを構築する場合、* p++は左シフトを実行する前に'long'(32ビット)に変換されるため、左シフトは* p ++ではビットを失いませんが、
s.i32 |= (unsigned)(*p++ << 8);
* p ++が最初にシフトされ、次にunsigned intに変換されますが、シフト中に* p ++のビットはすべて失われませんか?
ここでも、Cの基本のいくつかが欠けている可能性があることに気付きました。誰かがここで手を差し伸べることを願っています。
ありがとう、