gpt4 book ai didi

c++ - 试图翻转 std::bitset 中的位顺序

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:07 24 4
gpt4 key购买 nike

我正在研究一个使用 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

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

main.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 的函数这样做,标准库中还有其他选项吗?还是我必须自己写?如果是这样,我不太确定如何以简单和高效的方式实现它。

最佳答案

我不知道有哪个算法可以做到这一点,但您可以结合使用 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 类型一起使用。

关于c++ - 试图翻转 std::bitset 中的位顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55998550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com