質問するログイン新規登録

回答編集履歴

2

追加

2020/10/06 14:50

投稿

PingHermit
PingHermit

スコア479

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

ちょっと変更

2020/10/06 14:50

投稿

PingHermit
PingHermit

スコア479

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 <stdio.h>
3
+ #include <stdio.h>
4
- int BitScanReverse(unsigned word)
4
+ int BitScanReverse(unsigned word)
5
5
  {
6
-   unsigned z;
6
+ unsigned z;
7
-   int n = 0;
7
+ int n = 0;
8
+ if (word == 0)
9
+ return -1;
8
-   if ((z = word & 0xffff0000) != 0) {
10
+ if ((z = word & 0xffff0000) != 0) {
9
-     n += 16; word = z;
11
+ n += 16; word = z;
10
-   }
12
+ }
11
-   if ((z = word & 0xff00ff00) != 0) {
13
+ if ((z = word & 0xff00ff00) != 0) {
12
-     n += 8; word = z;
14
+ n += 8; word = z;
13
-   }
15
+ }
14
-   if ((z = word & 0xf0f0f0f0) != 0) {
16
+ if ((z = word & 0xf0f0f0f0) != 0) {
15
-     n += 4; word = z;
17
+ n += 4; word = z;
16
-   }
18
+ }
17
-   if ((z = word & 0xcccccccc) != 0) {
19
+ if ((z = word & 0xcccccccc) != 0) {
18
-     n += 2; word = z;
20
+ n += 2; word = z;
19
-   }
21
+ }
20
-   if ((z = word & 0xaaaaaaaa) != 0) {
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 main()
25
+ int main()
27
26
  {
28
-   unsigned u = 0;
27
+ unsigned u = 0;
29
-   scanf("%u", &u);
28
+ scanf("%u", &u);
30
-   int i = BitScanReverse(u);
29
+ int i = BitScanReverse(u);
31
-   printf("%u\n", i < 0 ? 0u : (1u << i));
30
+ printf("%u\n", i < 0 ? 0u : (1u << i));
32
-   return 0;
31
+ return 0;
33
32
  }
34
-
35
33
  ```