comData[0] = data[0] << 2 | data[1] >> 4;これは一体なんですか?

補足

また、回答で #pragma pack(push) #pragma pack(1) typedef struct { int w : 6; int x : 6; int y : 6; int z : 6; } WXYZ; #pragma pack(pop) // sizeof(WXYZ) =&gt; 3 とありました。 アライメントで1を設定しているので設置アドレスが4の倍数でない場合でも(実行環境が32bitだとして) 詰め物がされなくなるということですよね? 詰め物はされなくなったとはいえ int型が4つあるのだから 4*4で16byteなんじゃないかと考えてしまうのですが・・・ どうなっているんでしょうか?

C言語関連47閲覧

ベストアンサー

0

ThanksImg質問者からのお礼コメント

ありがとうございました。

お礼日時:2020/4/18 9:42

その他の回答(2件)

不適切な内容が含まれている可能性があるため、非表示になっています。

投稿内容に関する注意
0

なんで他所のQ&Aサイトの質問をこっちに引っ張ってくるかしら。 あっちには「マルチポストを推奨しない」なんていうルールもあるけれど、なんでそういうルールがあるか、そのココロを尊重するつもりはない?

これはマルチポストに当てはまらないと考えました。 あくまでも引用です 他者がしているの質問に関係ない私が割り込んで コメントで質問するのもそれこそ マナーに触れると思い このような形で質問しました。

0

>comData[0] = data[0] << 2 | data[1] >> 4;これは一体なんですか? intの4byte中6bitしか使用しないと明言されています。 そうすると必ず上位2bitは空きがある(00である)という事です。 空きがあるので送信データでは削って並べてしまいます。 そうすると4つで3byteとなります。 1データ目の6bit+2データ目の前2bit 2データ目の後ろ4bit+3データ目の前4bit 3データ目の後ろ2bit+4データ目の6bit の組み合わせになります >int data[4] = {10, 20, 40, 60}; >comData[0] = data[0] << 2 | data[1] >> 4 実際のデータ演算出力したほうがわかりやすいかと思う。 data[0] << 2| data[1] >> 4 =0b00001010<<2|0b00010100>>4 //欲しいのは0b00001010の3bit目以降(001010)と //0b00010100の3,4bit目(01) =0b00101000|0b00000001 //左シフトでdata[0]の上位空きbitを削る //左シフトした結果後ろ2bitは空き(00)となる //右シフトでdata[1]の下位4bitを削る //右シフトした結果前4bitは空き(00)となる //その結果上位2bitがもともと空き(00)だったので上位6bitが空き(00)となる =0b001010001 //bitのorをとるので1がたっているものが残る データを復号化する時はこの逆手順で行う >詰め物はされなくなったとはいえ int型が4つあるのだから 4*4で16byteなんじゃないかと考えてしまうのですが・・・ 見るのは >#pragma pack(push) >#pragma pack(1) ここの部分のところです 4byteの頭からみるのではなく詰め物を削った 残り3byteから見るように変更しています >#pragma pack(pop) でアライメントをもとに戻してintが元の4byteになるようにしています >comData[0] = data[0] << 2 | data[1] >> 4; この辺の手順を省いてしまおうって内容ですが リンク先に書かれている通り環境依存なので いつも使えるというわけじゃないです。 またこれもリンク先にかかれている通り送信側と受け側が同じ 処理系・環境でないとどの様に処理されるかわかならい 危険がある処理です。

>#pragma pack(push) >#pragma pack(1) すみません ここの部分がどうしてもわからないのでお願いします。 例えば・・・ char a; char b; int c; とあったら アドレス 0x0000 |-a-| 0x0001 詰め物 0x0002   詰め物 0x0003   詰め物 0x0004 |-b-| 0x0005   詰め物 0x0006   詰め物 0x0007   詰め物 0x0008 |-c-| 0x0009 |-c-| 0x000A |-c-| 0x000B |-c-| このようになると思います。 今回の件でアライメントが1になっているので アドレス 0x0000 |-a-| 0x0001 |-b-| 0x0002  |-c-| 0x0003   |-c-| 0x0004 |-c-| 0x0005   |-c-| 上記のようになると思うのですが ここの私の認識はあっていますか?