【问题标题】:C++ - How to left/right circular shift a bitset?C++ - 如何左/右循环移位一个位集?
【发布时间】:2022-01-23 20:48:28
【问题描述】:

假设我有一个名为left28 的std::bitset<28>。 我正在寻找left circular shiftleft28。

经过一番搜索,我遇到了std::rotl (C++20),但它似乎与bitset 不匹配,所以我不知道我将如何解决这个问题。

【问题讨论】:

  • 你可以使用operator<<和operator>>。
  • 是的,但是你可以通过添加一个读和一个写操作轻松地将它变成一个循环。

标签: c++ operators c++20 bit-shift bitset


【解决方案1】:

您可以通过组合右移和左移来实现左循环移位。

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 为负数时让每个函数调用另一个。

【讨论】:

  • 对有符号移位计数的扩展可以通过用模数替换余数运算来完成。不幸的是,C++ 没有提供标准的模函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多