回答編集履歴

3

追記

2017/07/03 23:16

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

test CHANGED
@@ -1,3 +1,31 @@
1
+ ###追記2
2
+
3
+
4
+
5
+ raccyさん他の方が丁寧に回答くださっているので蛇足的ではありますが、C/C++についての自分の回答は**間違い**であることを改めて強調しておきたいと思います。
6
+
7
+ 特定のC/C++コンパイラーの仕様にはシフト演算子の振る舞いが「他のコンパイラーでは違うかもしれない」との警告とともに明記されていたりしますが、それに依存したコードはもちろん可搬性を損なう結果になります。
8
+
9
+ Javaなど他の言語の中には「言語仕様でシフトの振る舞いが一意に決められていて可搬性のあるプログラムでそれを前提にできる」ものもあるのですが、C/C++ではそうではないわけです。
10
+
11
+ 自分が言うのも間抜けですが、「**仕様書で正確な意味を把握していないといつか痛い目にあう**」ことの実例として教訓にしていただければと思います。
12
+
13
+
14
+
15
+ - 自分のプログラムにバグを混入させてしまう
16
+
17
+ - 間違った知識を他者へ広めてしまう(そして罪なきプログラマーを迷宮へいざなう・・・)
18
+
19
+
20
+
21
+ 前者もそうですが後者が特に罪深いと思います。改めてお詫びいたします。
22
+
23
+
24
+
25
+ 以下元の回答
26
+
27
+ ---
28
+
1
29
  ローテートとシフトを混同されているように思えます。図にかかれた演算はシフトではなくローテートと呼ばれます。
2
30
 
3
31
 
@@ -16,6 +44,6 @@
16
44
 
17
45
  ---
18
46
 
19
- 訂正・補足:Wikipediaのシフトの説明として算術シフト、論理シフトと2の補数表現を結び付けて説明したのですが、raccyさんの回答をご覧いただければわかるように自分の説明は適切とは言えませんでした。失礼しました!
47
+ 訂正・補足1:Wikipediaのシフトの説明として算術シフト、論理シフトと2の補数表現を結び付けて説明したのですが、raccyさんの回答をご覧いただければわかるように自分の説明は適切とは言えませんでした。失礼しました!
20
48
 
21
49
 

2

訂正

2017/07/03 23:16

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

test CHANGED
@@ -11,3 +11,11 @@
11
11
 
12
12
 
13
13
  算術右シフトについて、それが二進数でなぜそうなるのかは、2の補数表現についてよく理解した上で考えるとわかると思います。(逆に2の補数表現を把握していないとピンとこないはずです)
14
+
15
+
16
+
17
+ ---
18
+
19
+ 訂正・補足:Wikipediaのシフトの説明として算術シフト、論理シフトと2の補数表現を結び付けて説明したのですが、raccyさんの回答をご覧いただければわかるように自分の説明は適切とは言えませんでした。失礼しました!
20
+
21
+

1

誤記訂正

2017/07/03 15:45

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

test CHANGED
@@ -6,4 +6,8 @@
6
6
 
7
7
 
8
8
 
9
- 右シフトは単純にいうと符号付きの数を2で整数除算するのが算術右シフトで、負号なしの数を2で整数除算するのが論理右シフトということをまず覚えておくとよいと思います。それが二進数でどう表現されるかは、2の補数表現についてよく理解した上でならわかると思います。(逆に2の補数表現を把握していないとピンとこないはずです)
9
+ 右シフトは単純にいうと符号付きの数を2で整数除算するのが算術右シフトで、負号なしの数を2で整数除算するのが論理右シフトということをまず覚えておくとよいと思います。
10
+
11
+
12
+
13
+ 算術右シフトについて、それが二進数でなぜそうなるのかは、2の補数表現についてよく理解した上で考えるとわかると思います。(逆に2の補数表現を把握していないとピンとこないはずです)