C++ - 如何左/右循环移位一个位集?

Posted

技术标签:

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

假设我有一个名为left28std::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++ - 如何左/右循环移位一个位集?的主要内容,如果未能解决你的问题,请参考以下文章

转载移位指令

汇编中的移位指令(8086CPU)

CCD移位寄存器 的工作原理是啥啊

实现字符串右循环移位

西门子plc循环移位指令的用法

Matlab中的左循环移位,用于不同数量位置的矩阵的每一行