C++ - 如何 left/right 循环移位一个位集?
C++ - How to left/right circular shift a bitset?
假设我有一个名为 left28
的 std::bitset<28>
。
我正在寻找 left circular shift left28
.
经过一些搜索,我遇到了 std::rotl
(C++20),但它似乎与 bitset
配合得不好,所以我不知道我该怎么办把它拉下来。
您可以通过组合右移和左移来实现左循环移位。
template<size_t N>
std::bitset<N> rotl( std::bitset<N> const& bits, unsigned count )
{
count %= N; // Limit count to range [0,N)
return bits << count | bits >> (N - count);
// The shifted bits ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ The wrapped bits
}
请注意,与 std::rotl
不同,此示例中的计数是 unsigned
。
如果您希望它是 signed
,例如 int
,请编写一个匹配的 rotr
并让每个函数在 count
为负数时调用另一个函数。
假设我有一个名为 left28
的 std::bitset<28>
。
我正在寻找 left circular shift left28
.
经过一些搜索,我遇到了 std::rotl
(C++20),但它似乎与 bitset
配合得不好,所以我不知道我该怎么办把它拉下来。
您可以通过组合右移和左移来实现左循环移位。
template<size_t N>
std::bitset<N> rotl( std::bitset<N> const& bits, unsigned count )
{
count %= N; // Limit count to range [0,N)
return bits << count | bits >> (N - count);
// The shifted bits ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ The wrapped bits
}
请注意,与 std::rotl
不同,此示例中的计数是 unsigned
。
如果您希望它是 signed
,例如 int
,请编写一个匹配的 rotr
并让每个函数在 count
为负数时调用另一个函数。