C++ - 如何左/右循环移位一个位集?
Posted
技术标签:
【中文标题】C++ - 如何左/右循环移位一个位集?【英文标题】:C++ - How to left/right circular shift a bitset? 【发布时间】:2022-01-23 20:48:28 【问题描述】:假设我有一个名为left28
的std::bitset<28>
。
我正在寻找left circular shiftleft28
。
经过一番搜索,我遇到了std::rotl
(C++20),但它似乎与bitset
不匹配,所以我不知道我将如何解决这个问题。
【问题讨论】:
你可以使用operator<<
和operator>>
。
是的,但是你可以通过添加一个读和一个写操作轻松地将它变成一个循环。
【参考方案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++ 没有提供标准的模函数。以上是关于C++ - 如何左/右循环移位一个位集?的主要内容,如果未能解决你的问题,请参考以下文章