回答編集履歴

2

日本語の微修正

2015/08/30 00:22

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -1,6 +1,6 @@
1
1
  【普通の解説】
2
2
 
3
- ※ 宗教的な問題で、`unsigned`は全て`unsigned int`と記述しています。
3
+ ※ 宗教的な理由で、`unsigned`は全て`unsigned int`と記述しています。
4
4
 
5
5
  まず、`int_bits()`が`unsigned int`におけるbitsの数になることは理解できているでしょうか?もし、`unsigned int`が32bitsなら`int_bits()`は32を返します(ぶっちゃけ、`sizeof(unsigned int) * CHAR_BIT`でもいい気がするのですが)。次に、`for(i=int_bits()-1;i>=0;i--)`の部分ですが、`i`について、31(-1しているので32ではありません)から0までforループで回すという意味です。あとはforループの中身を見ればわかるはずです。
6
6
 
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- iは31から始まりますので、最初に31個分左にシフトします。
19
+ そして、iは31から始まりますので、まずは31個分左にシフトし、下記になります。
20
20
 
21
21
 
22
22
 
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- 全て0になりました。iが31から6までは同じようにすべて0になります。ビットが一切立ってないので、ここまでは0ということです。そして、0は偽なので三項演算子の部分は'0'が返ります。ではiが5の場合はどうなるかというと、
27
+ 全て0になりました。iが31から6までは同じようにすべて0になります。ビットが一切立ってないので、ここまでは0ということです。そして、0は偽なので三項演算子の部分は'0'が返り、0が表示されます。ではiが5の場合はどうなるかというと、
28
28
 
29
29
 
30
30
 
@@ -48,7 +48,7 @@
48
48
 
49
49
 
50
50
 
51
- となり、つまり、左から6番目(5番目ではありません。判断するのはi+1番目です)のビットが立っているかがわかると言うことです。そして、1は真なので三項演算子の部分は'1'が返ります。同じように`i`が4の場合は、
51
+ となり、つまり、左から6番目(5番目ではありません。判断するのはi+1番目です)のビットが立っているかがわかると言うことです。そして、1は真なので三項演算子の部分は'1'が返り、1が表示されます。同じように`i`が4の場合は、
52
52
 
53
53
 
54
54
 

1

本編を書き忘れていた。

2015/08/30 00:22

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -1,3 +1,113 @@
1
+ 【普通の解説】
2
+
3
+ ※ 宗教的な問題で、`unsigned`は全て`unsigned int`と記述しています。
4
+
5
+ まず、`int_bits()`が`unsigned int`におけるbitsの数になることは理解できているでしょうか?もし、`unsigned int`が32bitsなら`int_bits()`は32を返します(ぶっちゃけ、`sizeof(unsigned int) * CHAR_BIT`でもいい気がするのですが)。次に、`for(i=int_bits()-1;i>=0;i--)`の部分ですが、`i`について、31(-1しているので32ではありません)から0までforループで回すという意味です。あとはforループの中身を見ればわかるはずです。
6
+
7
+
8
+
9
+ forループの中身ですが、`x>>i`が何をしているかというと、`x`を`i`分だけシフトするという意味です。たとえば、xが55という数字の場合、2進数では下記になります。
10
+
11
+
12
+
13
+ x: 0000 0000 0000 0000 0000 0000 0011 0111
14
+
15
+ ※ わかりやすいように、4bits毎にスペースで区切っています。
16
+
17
+
18
+
19
+ iは31から始まりますので、最初に31個分左にシフトします。
20
+
21
+
22
+
23
+ x >> 31: 0000 0000 0000 0000 0000 0000 0000 0000
24
+
25
+
26
+
27
+ 全て0になりました。iが31から6までは同じようにすべて0になります。ビットが一切立ってないので、ここまでは0ということです。そして、0は偽なので三項演算子の部分は'0'が返ります。ではiが5の場合はどうなるかというと、
28
+
29
+
30
+
31
+ x >> 5: 0000 0000 0000 0000 0000 0000 0000 0001
32
+
33
+
34
+
35
+ と、最後に一つだけ残ります。次に`1U`はなにかというと下記のようになっています。
36
+
37
+
38
+
39
+ 1U: 0000 0000 0000 0000 0000 0000 0000 0001
40
+
41
+
42
+
43
+ この二つを`&`で演算すれば、
44
+
45
+
46
+
47
+ (x >> 5)&1U: 0000 0000 0000 0000 0000 0000 0000 0001
48
+
49
+
50
+
51
+ となり、つまり、左から6番目(5番目ではありません。判断するのはi+1番目です。)のビットが立っているかがわかると言うことです。そして、1は真なので三項演算子の部分は'1'が返ります。同じように`i`が4の場合は、
52
+
53
+
54
+
55
+ x >> 4: 0000 0000 0000 0000 0000 0000 0000 0011
56
+
57
+ 1U: 0000 0000 0000 0000 0000 0000 0000 0001
58
+
59
+ (x >> 4)&1U: 0000 0000 0000 0000 0000 0000 0000 0001
60
+
61
+
62
+
63
+ となり、5番目のビットが立っていると判断できます。では3の場合はどうでしょうか?
64
+
65
+
66
+
67
+ x >> 3: 0000 0000 0000 0000 0000 0000 0000 0110
68
+
69
+ 1U: 0000 0000 0000 0000 0000 0000 0000 0001
70
+
71
+ (x >> 3)&1U: 0000 0000 0000 0000 0000 0000 0000 0000
72
+
73
+
74
+
75
+ おお、0になりますね。つまり4番目のビットは立っていない、なので0なのです。あとは同じように、0までするだけです。
76
+
77
+
78
+
79
+ x >> 2: 0000 0000 0000 0000 0000 0000 0000 1101
80
+
81
+ 1U: 0000 0000 0000 0000 0000 0000 0000 0001
82
+
83
+ (x >> 2)&1U: 0000 0000 0000 0000 0000 0000 0000 0001 # 3番目はビットが立ている
84
+
85
+
86
+
87
+ x >> 1: 0000 0000 0000 0000 0000 0000 0001 1011
88
+
89
+ 1U: 0000 0000 0000 0000 0000 0000 0000 0001
90
+
91
+ (x >> 1)&1U: 0000 0000 0000 0000 0000 0000 0000 0001 # 2番目はビットが立ている
92
+
93
+
94
+
95
+ x >> 0: 0000 0000 0000 0000 0000 0000 0011 0111
96
+
97
+ 1U: 0000 0000 0000 0000 0000 0000 0000 0001
98
+
99
+ (x >> 0)&1U: 0000 0000 0000 0000 0000 0000 0000 0001 # 1番目はビットが立ている
100
+
101
+
102
+
103
+ 結果、00000000000000000000000000110111が表示されることがわかると思います。
104
+
105
+
106
+
107
+ ---
108
+
109
+ 【おまけ】
110
+
1
111
  汎用性を持たせてみました。
2
112
 
3
113
  ```C