有点列移位

nha*_*123 3 c++ bit-manipulation

如何在8x8区域中移动列?例如,我有一个64位无符号整数,如下所示:

#include <boost/cstdint.hpp>

int main()
{
    /** In binary:
      * 
      * 10000000
      * 10000000
      * 10000000
      * 10000000
      * 00000010
      * 00000010
      * 00000010
      * 00000010
      */
    boost::uint64_t b = 0x8080808002020202;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想将第一个垂直行转换为四次,之后它变为:

/** In binary:
  * 
  * 00000000
  * 00000000
  * 00000000
  * 00000000
  * 10000010
  * 10000010
  * 10000010
  * 10000010
  */

  b == 0x82828282;
Run Code Online (Sandbox Code Playgroud)

这只能通过逐位运算符相对快速地完成,还是什么?

dou*_*lep 5

我最好的猜测是:

(((b & 0x8080808080808080) >> 4 * 8) | (b & ~0x8080808080808080)
Run Code Online (Sandbox Code Playgroud)

我们的想法是隔离列位并仅移位它们.