回答編集履歴
2
追加
answer
CHANGED
@@ -30,4 +30,21 @@
|
|
30
30
|
printf("%u\n", i < 0 ? 0u : (1u << i));
|
31
31
|
return 0;
|
32
32
|
}
|
33
|
-
```
|
33
|
+
```
|
34
|
+
関数にしなくても
|
35
|
+
```
|
36
|
+
#include <stdio.h>
|
37
|
+
int main()
|
38
|
+
{
|
39
|
+
unsigned u = 0, z;
|
40
|
+
scanf("%u", &u);
|
41
|
+
if ((z = u & 0xffff0000) != 0) u = z;
|
42
|
+
if ((z = u & 0xff00ff00) != 0) u = z;
|
43
|
+
if ((z = u & 0xf0f0f0f0) != 0) u = z;
|
44
|
+
if ((z = u & 0xcccccccc) != 0) u = z;
|
45
|
+
if ((z = u & 0xaaaaaaaa) != 0) u = z;
|
46
|
+
printf("%u\n", u);
|
47
|
+
return 0;
|
48
|
+
}
|
49
|
+
```
|
50
|
+
でもよかった。
|
1
ちょっと変更
answer
CHANGED
@@ -1,35 +1,33 @@
|
|
1
1
|
[Quora](https://jp.quora.com/%E6%9C%80%E4%B8%8A%E4%BD%8D%E3%83%93%E3%83%83%E3%83%88-MSB-%E3%81%AE%E4%BD%8D%E7%BD%AE%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B%E5%8A%B9%E6%9E%9C%E7%9A%84%E3%81%AA%E6%96%B9%E6%B3%95%E3%81%AF%E3%81%82%E3%82%8A)を参照して作ってみました。
|
2
2
|
```
|
3
|
-
#include
|
3
|
+
#include <stdio.h>
|
4
|
-
int
|
4
|
+
int BitScanReverse(unsigned word)
|
5
5
|
{
|
6
|
-
|
6
|
+
unsigned z;
|
7
|
-
|
7
|
+
int n = 0;
|
8
|
+
if (word == 0)
|
9
|
+
return -1;
|
8
|
-
|
10
|
+
if ((z = word & 0xffff0000) != 0) {
|
9
|
-
|
11
|
+
n += 16; word = z;
|
10
|
-
|
12
|
+
}
|
11
|
-
|
13
|
+
if ((z = word & 0xff00ff00) != 0) {
|
12
|
-
|
14
|
+
n += 8; word = z;
|
13
|
-
|
15
|
+
}
|
14
|
-
|
16
|
+
if ((z = word & 0xf0f0f0f0) != 0) {
|
15
|
-
|
17
|
+
n += 4; word = z;
|
16
|
-
|
18
|
+
}
|
17
|
-
|
19
|
+
if ((z = word & 0xcccccccc) != 0) {
|
18
|
-
|
20
|
+
n += 2; word = z;
|
19
|
-
|
21
|
+
}
|
20
|
-
|
22
|
+
return (word & 0xaaaaaaaa) ? n + 1 : n;
|
21
|
-
n += 1; word = z;
|
22
|
-
}
|
23
|
-
return word ? n : n - 1;
|
24
23
|
}
|
25
24
|
|
26
|
-
int
|
25
|
+
int main()
|
27
26
|
{
|
28
|
-
|
27
|
+
unsigned u = 0;
|
29
|
-
|
28
|
+
scanf("%u", &u);
|
30
|
-
|
29
|
+
int i = BitScanReverse(u);
|
31
|
-
|
30
|
+
printf("%u\n", i < 0 ? 0u : (1u << i));
|
32
|
-
|
31
|
+
return 0;
|
33
32
|
}
|
34
|
-
|
35
33
|
```
|