【问题标题】:Trying to flip the order of bits in std::bitset试图翻转 std::bitset 中的位顺序
【发布时间】:2019-05-06 03:48:01
【问题描述】:

我正在研究一个使用 std::bitset 的结构,它看起来像这样:

Register.h

#pragma once

#include <bitset>
#include <vector> // used for typedefs of int types

namespace vpc { // virtual pc

    typedef std::int8_t  i8;
    typedef std::int16_t i16;
    typedef std::int32_t i32;
    typedef std::int64_t i64;

    const unsigned int BYTE  = 0x08;
    const unsigned int WORD  = 0x10;
    const unsigned int DWORD = 0x20;
    const unsigned int QWORD = 0x40;

    typedef std::bitset<BYTE>  Byte;
    typedef std::bitset<WORD>  Word;
    typedef std::bitset<DWORD> DWord;
    typedef std::bitset<QWORD> QWord;

    template<std::uint64_t N = BYTE>
    struct Register {
        Byte register_;

        Register() {
            static_assert(
                // assert 8 <= N <= 64
                ((N%8) == 0) && (N >=8) && (N <= 64) &&
                // and N != 24,40,48 and 56
                (N != 24) && (N != 40) && (N != 48) && (N != 56)
            ); 
        }
    }

    template<>
    struct Register<WORD> {
        Word register_;
        Register() = default;
     };

     template<>
     struct Register<DWORD> {
         DWord register_;
         Register() = default;
     }

     template<>
     struct Register<QWORD> {
         QWord register_;
         Register() = default;
     }

} // namespace vpc

然后我使用这个小程序将一些值写入寄存器类并打印到屏幕上:

ma​​in.cpp

#include <iostream>
#include "Register.h"

int main() {
    using namespace vpc;

    Register r1;
    r1.register_ = 169;

    std::cout << "Stored Value\n";
std::cout << r1.register_ << "\n";
// 10101001 // printed value;

std::cout << "Bit Values\n";
for (i16 i = 0; i < 8; i++) {
    std::cout << r1.register_[i] << ' ';
}
std::cout << "\n\n";
// 1 0 0 1 0 1 0 1 // printed bit values

// using std::bitset.flip()
r1.register_.flip();
std::cout << "Flipped Bit Values\n";
for (i16 i = 0; i < 8; i++) {
    std::cout << r1.register_[i] << ' ';
}
std::cout << "\n\n";
// 0 1 1 0 1 0 1 0 // printed bit values    

    return EXIT_SUCCESS;
}

上面的代码没有任何问题,但是翻转并不是我想要的。很高兴知道它的存在以及它的作用,但如果我们仔细查看输出:

输出

Stored Value
10101001

Bit Values
1 0 0 1 0 1 0 1

Flipped Bit Values
0 1 1 0 1 0 1 0

翻转功能不是我想要的。我想反转存储的位顺序并将其保存回自身或创建它的副本。我希望能够拥有一个带有位的字节:0111 0011,它被存储并能够生成一个副本或将一个具有值1100 1110 而不是1000 1100 的字节保存回自身。

我没有看到任何属于 std::bitset 的函数可以执行此操作,std 库中还有其他选项吗?还是我必须自己写?如果是这样,我不太确定如何以简单和高效的方式实现它。

【问题讨论】:

标签: c++ c++17 bitset


【解决方案1】:

我不知道有哪一种算法可以做到这一点,但您可以结合使用 bitset::to_stringstd::reverse 来做到这一点。

一个最小的例子。

#include "Register.h"
#include <algorithm>
#include <bitset>
#include <iostream>
#include <string>

int main() {
  vpc::Byte register_ = 169;
  std::cout << register_ << std::endl;

  auto str = register_.to_string();
  std::reverse(str.begin(), str.end());
  auto x = vpc::Byte(str);
  std::cout << x << std::endl;

  return 0;
}

Demo Here.

输出:

10101001
10010101

此方法可以与您定义的任何其他bitset 类型一起使用。

【讨论】:

  • 哇,太简单了;我知道您能够将位集转换为 int 或字符串,并且从未想过使用字符串的 reverse() 函数然后将其存储回位集。
  • 我制作了一个独立的函数模板,它接受一个 Register 进行位操作,然后将其存储回自身。我可以做一个类似的函数来获取值但返回一个副本。这可能非常有用,因为我正计划将这些结构用作虚拟 pc 中寄存器的基础。
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 2019-10-24
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 2015-08-21
  • 2021-05-17
  • 2011-07-12
相关资源
最近更新 更多