int64_t 到 std::vector<bool> 仅使用 `std`
int64_t to std::vector<bool> using only `std`
假设 x
是一个 int64_t
。我如何才能有效地将它转换为具有 64 个元素的 std::vector<bool>
,每个元素代表 x
,而不使用除 std
之外的其他库?
编辑:std::bitset<64>
不是我的选择,例如因为我需要调用 push_back
和 std::find
。
下面的 makeVec
函数将允许您将 64 位值转换为布尔向量:
#include <iostream>
#include <vector>
#include <cstdint>
std::vector<bool> makeVec(int64_t x) {
std::vector<bool> retVal;
uint64_t mask = 1ULL << 63;
for (int i = 0; i < 64; ++i) {
retVal.push_back((static_cast<uint64_t>(x) & mask) == 0 ? false : true);
mask >>= 1;
}
return retVal;
}
int main() {
auto vec = makeVec (42);
for (int i = 0; i < 64; ++i) {
std::cout << (vec[i] ? '1' : '0');
}
std::cout << '\n';
}
但是,您可能会发现为此使用 bitset
更容易,因此您的代码变得更简单:
#include <iostream>
#include <bitset>
int main() {
auto vec = std::bitset<64>(42);
for (int i = 63; i >= 0; --i) {
std::cout << vec[i];
}
std::cout << '\n';
}
您会注意到的一个区别是位位置的反转。对于位集,位置零是最低有效位,因此您必须为此进行调整。
如果您想在矢量解决方案中进行类似的排序(零索引是 最低 有效位),只需更改几行即可:
std::vector<bool> makeVec(int64_t x) {
std::vector<bool> retVal;
uint64_t mask = 1; // This one ...
for (int i = 0; i < 64; ++i) {
retVal.push_back((static_cast<uint64_t>(x) & mask) == 0 ? false : true);
mask <<= 1; // ... and this one.
}
return retVal;
}
假设 x
是一个 int64_t
。我如何才能有效地将它转换为具有 64 个元素的 std::vector<bool>
,每个元素代表 x
,而不使用除 std
之外的其他库?
编辑:std::bitset<64>
不是我的选择,例如因为我需要调用 push_back
和 std::find
。
下面的 makeVec
函数将允许您将 64 位值转换为布尔向量:
#include <iostream>
#include <vector>
#include <cstdint>
std::vector<bool> makeVec(int64_t x) {
std::vector<bool> retVal;
uint64_t mask = 1ULL << 63;
for (int i = 0; i < 64; ++i) {
retVal.push_back((static_cast<uint64_t>(x) & mask) == 0 ? false : true);
mask >>= 1;
}
return retVal;
}
int main() {
auto vec = makeVec (42);
for (int i = 0; i < 64; ++i) {
std::cout << (vec[i] ? '1' : '0');
}
std::cout << '\n';
}
但是,您可能会发现为此使用 bitset
更容易,因此您的代码变得更简单:
#include <iostream>
#include <bitset>
int main() {
auto vec = std::bitset<64>(42);
for (int i = 63; i >= 0; --i) {
std::cout << vec[i];
}
std::cout << '\n';
}
您会注意到的一个区别是位位置的反转。对于位集,位置零是最低有效位,因此您必须为此进行调整。
如果您想在矢量解决方案中进行类似的排序(零索引是 最低 有效位),只需更改几行即可:
std::vector<bool> makeVec(int64_t x) {
std::vector<bool> retVal;
uint64_t mask = 1; // This one ...
for (int i = 0; i < 64; ++i) {
retVal.push_back((static_cast<uint64_t>(x) & mask) == 0 ? false : true);
mask <<= 1; // ... and this one.
}
return retVal;
}