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

回答編集履歴

5

fix typo

2021/02/24 08:39

投稿

yohhoy
yohhoy

スコア6191

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::bit_witdh(bs.to_ullong());
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::bit_witdh`関数](https://cpprefjp.github.io/reference/bit/bit_witdh.html)を活用する前提で、`unsinged long long`ビット幅づつ検査するアルゴリズムを書いてみました。
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::bit_witdh(bs.to_ullong());
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::bit_witdh(bs.to_ullong());
42
+ return std::bit_width(bs.to_ullong());
43
43
  } else {
44
44
  auto tmp = bs >> shift;
45
- return std::bit_witdh(tmp.to_ullong())) + shift;
45
+ return std::bit_width(tmp.to_ullong())) + shift;
46
46
  }
47
47
  }
48
48
  }

4

use bit_witdh

2021/02/24 08:39

投稿

yohhoy
yohhoy

スコア6191

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 ULL_BITS - std::countl_zero(bs.to_ullong());
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::countl_zero`関数](https://cpprefjp.github.io/reference/bit/countl_zero.html)を活用する前提で、`unsinged long long`ビット幅づつ検査するアルゴリズムを書いてみました。
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 ULL_BITS - std::countl_zero(bs.to_ullong());
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 ULL_BITS - std::countl_zero(bs.to_ullong());
42
+ return std::bit_witdh(bs.to_ullong());
43
43
  } else {
44
44
  auto tmp = bs >> shift;
45
- return (ULL_BITS - std::countl_zero(tmp.to_ullong())) + shift;
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/EuZrZkxtI4jFI6VM](https://wandbox.org/permlink/EuZrZkxtI4jFI6VM)
51
+ Demo: [https://wandbox.org/permlink/eodeUSQEYbUk4P9O](https://wandbox.org/permlink/eodeUSQEYbUk4P9O)

3

update code (optimize)

2021/02/24 08:39

投稿

yohhoy
yohhoy

スコア6191

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 = (bs & mask) >> shift;
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/ZHnBxroJYfEuXQnv](https://wandbox.org/permlink/ZHnBxroJYfEuXQnv)
51
+ Demo: [https://wandbox.org/permlink/EuZrZkxtI4jFI6VM](https://wandbox.org/permlink/EuZrZkxtI4jFI6VM)

2

refinement

2021/02/24 05:37

投稿

yohhoy
yohhoy

スコア6191

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

2021/02/24 05:25

投稿

yohhoy
yohhoy

スコア6191

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