回答編集履歴

1

質問者から、追加の質問があったので、それへの答えを追加した。

2017/09/21 05:55

投稿

coco_bauer
coco_bauer

スコア6915

test CHANGED
@@ -79,3 +79,41 @@
79
79
  cmd[5] = 0xf0;
80
80
 
81
81
  ```
82
+
83
+
84
+
85
+ === 2)ビットシフト操作 に関して、補足
86
+
87
+
88
+
89
+ ```ここに言語を入力
90
+
91
+ picTotalLen = (resp[3]) | (resp[4] << 8) | (resp[5] << 16);
92
+
93
+ ```
94
+
95
+ は、picTotalLenをInt(32ビットの整数)の、下から8ビットはresp[3]の8ビットと同じ、下から9ビット目から16ビット目はresp[4]の8ビットと同じ、下から17ビット目から24ビット目はresp[5]の8ビットと同じであるようにしたいという事だと思います。
96
+
97
+ 例えば、resp[3]=0x56、resp[4]=0x34、resp[5]=0x12だとすると、picTotalLen=0x123456にしたいのだと推測されます。
98
+
99
+
100
+
101
+ この推測が正しいとして、元のコードのように8ビットの値を8桁以上シフトしたら値は0になりますから、8桁シフトしても値がなくならない(十分なビット数がある)値であるIntのデータであるpitTotalLenをシフトするようにします。
102
+
103
+
104
+
105
+ コードは以下のようになります。(各行の右側のコメントで、何をしているか説明しています)
106
+
107
+ ```ここに言語を入力
108
+
109
+ picTotalLen = resp[5]; // resp[3]~resp[5]の値が上に揚げた例えのとおりだとすると、picTotalLen=0x12になる。この時点では1-8ビット目だが、後でシフトされた17-24ビット目の値になる
110
+
111
+ picTotalLen = picTotalLen << 8; // 左に8ビットシフトするとpicTotalLen=0x1200になる。
112
+
113
+ picTotalLen = picTotalLen | resp[4] // 1-8ビット目にresp[4]の値を入れる(元が0なので、OR演算することでresp[4]と同じ値になります)と、picTotalLen = 0x1234になる。
114
+
115
+ picTotalLen = picTotalLen << 8; // 左に8ビットシフトするとpicTotalLen=0x123400になる。
116
+
117
+ PicTotalLen = picTotalLen | resp[3] // 1-8ビット目にresp[3]の値を入れると、picTotalLen=0x123456になる。
118
+
119
+ ```