回答編集履歴
5
fix typo
answer
CHANGED
@@ -10,14 +10,14 @@
|
|
10
10
|
{
|
11
11
|
constexpr size_t ULL_BITS = std::numeric_limits<unsigned long long>::digits;
|
12
12
|
static_assert(N <= ULL_BITS);
|
13
|
-
return std::
|
13
|
+
return std::bit_width(bs.to_ullong());
|
14
14
|
}
|
15
15
|
```
|
16
16
|
|
17
17
|
> サイズが 64bit を超えるstd::bitset の 1 になっているビットのうち最上位のビットの位置を取得したいです。
|
18
18
|
> ループを回したり二分探索をするだけであれば難しくは無いですが簡潔では無いように思います。
|
19
19
|
|
20
|
-
この[`std::
|
20
|
+
この[`std::bit_width`関数](https://cpprefjp.github.io/reference/bit/bit_width.html)を活用する前提で、`unsinged long long`ビット幅づつ検査するアルゴリズムを書いてみました。
|
21
21
|
...素直に先頭bitからループを回した方がマシかもしれませんね。
|
22
22
|
|
23
23
|
|
@@ -27,7 +27,7 @@
|
|
27
27
|
{
|
28
28
|
constexpr size_t ULL_BITS = std::numeric_limits<unsigned long long>::digits;
|
29
29
|
if constexpr (N <= ULL_BITS) {
|
30
|
-
return std::
|
30
|
+
return std::bit_width(bs.to_ullong());
|
31
31
|
}
|
32
32
|
else {
|
33
33
|
std::bitset<N> mask = std::bitset<N>{~(0ULL)} << (N - ULL_BITS);
|
@@ -39,10 +39,10 @@
|
|
39
39
|
shift -= ULL_BITS;
|
40
40
|
}
|
41
41
|
if (shift <= 0) {
|
42
|
-
return std::
|
42
|
+
return std::bit_width(bs.to_ullong());
|
43
43
|
} else {
|
44
44
|
auto tmp = bs >> shift;
|
45
|
-
return std::
|
45
|
+
return std::bit_width(tmp.to_ullong())) + shift;
|
46
46
|
}
|
47
47
|
}
|
48
48
|
}
|
4
use bit_witdh
answer
CHANGED
@@ -10,14 +10,14 @@
|
|
10
10
|
{
|
11
11
|
constexpr size_t ULL_BITS = std::numeric_limits<unsigned long long>::digits;
|
12
12
|
static_assert(N <= ULL_BITS);
|
13
|
-
return
|
13
|
+
return std::bit_witdh(bs.to_ullong());
|
14
14
|
}
|
15
15
|
```
|
16
16
|
|
17
17
|
> サイズが 64bit を超えるstd::bitset の 1 になっているビットのうち最上位のビットの位置を取得したいです。
|
18
18
|
> ループを回したり二分探索をするだけであれば難しくは無いですが簡潔では無いように思います。
|
19
19
|
|
20
|
-
この[`std::
|
20
|
+
この[`std::bit_witdh`関数](https://cpprefjp.github.io/reference/bit/bit_witdh.html)を活用する前提で、`unsinged long long`ビット幅づつ検査するアルゴリズムを書いてみました。
|
21
21
|
...素直に先頭bitからループを回した方がマシかもしれませんね。
|
22
22
|
|
23
23
|
|
@@ -27,7 +27,7 @@
|
|
27
27
|
{
|
28
28
|
constexpr size_t ULL_BITS = std::numeric_limits<unsigned long long>::digits;
|
29
29
|
if constexpr (N <= ULL_BITS) {
|
30
|
-
return
|
30
|
+
return std::bit_witdh(bs.to_ullong());
|
31
31
|
}
|
32
32
|
else {
|
33
33
|
std::bitset<N> mask = std::bitset<N>{~(0ULL)} << (N - ULL_BITS);
|
@@ -39,13 +39,13 @@
|
|
39
39
|
shift -= ULL_BITS;
|
40
40
|
}
|
41
41
|
if (shift <= 0) {
|
42
|
-
return
|
42
|
+
return std::bit_witdh(bs.to_ullong());
|
43
43
|
} else {
|
44
44
|
auto tmp = bs >> shift;
|
45
|
-
return
|
45
|
+
return std::bit_witdh(tmp.to_ullong())) + shift;
|
46
46
|
}
|
47
47
|
}
|
48
48
|
}
|
49
49
|
```
|
50
50
|
|
51
|
-
Demo: [https://wandbox.org/permlink/
|
51
|
+
Demo: [https://wandbox.org/permlink/eodeUSQEYbUk4P9O](https://wandbox.org/permlink/eodeUSQEYbUk4P9O)
|
3
update code (optimize)
answer
CHANGED
@@ -41,11 +41,11 @@
|
|
41
41
|
if (shift <= 0) {
|
42
42
|
return ULL_BITS - std::countl_zero(bs.to_ullong());
|
43
43
|
} else {
|
44
|
-
auto tmp =
|
44
|
+
auto tmp = bs >> shift;
|
45
45
|
return (ULL_BITS - std::countl_zero(tmp.to_ullong())) + shift;
|
46
46
|
}
|
47
47
|
}
|
48
48
|
}
|
49
49
|
```
|
50
50
|
|
51
|
-
Demo: [https://wandbox.org/permlink/
|
51
|
+
Demo: [https://wandbox.org/permlink/EuZrZkxtI4jFI6VM](https://wandbox.org/permlink/EuZrZkxtI4jFI6VM)
|
2
refinement
answer
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
> サイズが 64bit を超えるstd::bitset の 1 になっているビットのうち最上位のビットの位置を取得したいです。
|
18
18
|
> ループを回したり二分探索をするだけであれば難しくは無いですが簡潔では無いように思います。
|
19
19
|
|
20
|
-
この[`std::countl_zero`関数](https://cpprefjp.github.io/reference/bit/countl_zero.html)を活用する前提で、`unsinged long long`ビット幅づつ検査する
|
20
|
+
この[`std::countl_zero`関数](https://cpprefjp.github.io/reference/bit/countl_zero.html)を活用する前提で、`unsinged long long`ビット幅づつ検査するアルゴリズムを書いてみました。
|
21
21
|
...素直に先頭bitからループを回した方がマシかもしれませんね。
|
22
22
|
|
23
23
|
|
1
add link
answer
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
> サイズが 64bit を超えるstd::bitset の 1 になっているビットのうち最上位のビットの位置を取得したいです。
|
18
18
|
> ループを回したり二分探索をするだけであれば難しくは無いですが簡潔では無いように思います。
|
19
19
|
|
20
|
-
この`std::countl_zero`関数を活用する前提で、`unsinged long long`ビット幅づつ検査するようなロジックを書いてました。
|
20
|
+
この[`std::countl_zero`関数](https://cpprefjp.github.io/reference/bit/countl_zero.html)を活用する前提で、`unsinged long long`ビット幅づつ検査するようなロジックを書いてました。
|
21
21
|
...素直に先頭bitからループを回した方がマシかもしれませんね。
|
22
22
|
|
23
23
|
|