【问题标题】:Convert uint64_t Bitmask to std::array of bool将 uint64_t 位掩码转换为 std::array of bool
【发布时间】:2018-07-06 13:37:07
【问题描述】:

目标是将std::uint64_t(用作位掩码)转换为std::array<bool>

这个问题类似于 C# 问题How can I convert an int to an array of bool?,但是对于 C++,我正在寻找具有最佳性能的算法。

给定一个用作位掩码的std::uint64_t,我知道可以按位循环其内容并进行位比较,将值设置为std::array<bool> 中相同位置的值。

但在全能的 C++ 中,必须是一种更有效的方式!也许一些肮脏的演员表,mallocs或诸如此类的东西?一切都好;我在 Windows / GCC 上,所以即使是 GCC-only 功能也是完全允许的。

【问题讨论】:

  • ...内联asm也可以
  • 你真的需要std::array<bool>吗?您可以将位掩码转换为 std::bitset 以随机访问各个位。
  • @NathanOliver 听起来不错,但很无聊
  • 假设您的系统上的布尔值是什么,那么没有任何类型可以将您从 64 位转换为 64 字节。 bitset 可能是更好的方法。您是否正在尝试解决某个特定问题?在我看来,最好的性能是保留 uint64_t 并在需要时提取所需的位。
  • 如果您的目标是 x86,您可以使用一些向量指令 (AVX?) 将单词的一部分存储到不同的目标中。不确定其他 ISA。

标签: c++ arrays performance gcc stdarray


【解决方案1】:

如果您只需要随机访问各个位,您可以使用std::bitset 而不是std::array。看起来像

uint64_t mask = some_value;
std::bitset<64> random_access(mask);

// and now you can use random_access[some_index]

std::bitset 确实缺少 begin()end() 成员,因此您不能将它与基于范围的 for 循环原样使用。但是,您可以使用基于常规索引的 for 循环来迭代 std::bitset,例如

for (size_t i = 0; i < random_access.size(); ++i)
    std::cout << random_access[i] << "\n";

【讨论】:

  • 如果我知道存在这样一个简单(因此很无聊)的解决方案,我就不会费心去问:'(
  • @nada 对不起,有时 C++ 只是给你你想要的;)
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2012-05-23
  • 2018-05-25
  • 2020-12-22
  • 1970-01-01
相关资源
最近更新 更多