Попытка перевернуть порядок битов в std::bitset
Я работаю над структурой, которая использует 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
что это делает, есть ли другие варианты из библиотеки std? Или я должен написать свой собственный? Если это так, я не совсем уверен, как реализовать это с учетом простоты и эффективности.
1 ответ
Я не знаю ни одного алгоритма, который делает это, но вы можете использовать комбинацию bitset::to_string
а также std::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
типы вы определили.