【问题标题】:how to create an array of elements with 1 bit in size in c++如何在 C++ 中创建一个大小为 1 位的元素数组
【发布时间】:2018-11-27 07:29:32
【问题描述】:

在c/c++中,我们可以在内存中定义一个1位的变量:like unsigned char value : 1;

有没有办法声明一个 1 位元素的数组?就像下面的 sudo 代码:

unsigned char : 1 data[10];

【问题讨论】:

标签: c++ arrays bit bit-fields


【解决方案1】:

问题在于,在大多数实现中,1 位变量仍将占用 1 个字节的内存,因为这是寻址内存的方式。但是,如果您有大量此类值,则可以解决此问题。一种这样的解决方案是std::bitset。你可以这样制作:

#include <bitset>
std::bitset<64> data;

您可以使用setresetflip 操作(将其设置为 1、0 或切换)来操作位。例如,您可以使用[] 访问位

if (data[5]) { ...

看看一个很好的例子here

【讨论】:

  • 感谢您的解决方案,但是我们无法控制 std::bitset 的确切内存布局,就像我们可以使用数组一样。例如 sizeof(std::bitset) 或 std::sizeof(std::bitset) 总是返回 8 个字节。它限制了它的使用,尤其是当我们想使用 union 来获取整数的位时。
  • 而且作为数组效率不高。 std::bitset 将使用位操作 > 和 & 在索引处获取位值。如果我们没有其他选择,我们可能会编写自己的位集来控制内存布局。我想知道我们是否可以定义数组,每个元素的大小为 1 位,我们不需要额外的位操作。
  • 您可以将 8 位字段 (unsigned int a: 1;) 打包到一个 struct 中,如果幸运的话,编译器会对其进行适当优化。然后,您可以使用这些结构来制作您自己的位集。但是,我不会推荐它。
  • 是的,你是对的,@Blaze。但是,如果我们这样做,那么我们就无法通过 operator[] 直接访问它们。我们现在需要做 if else 检查以选择正确的位。分支比位操作更昂贵。分支错误预测约为 3ns,每个引用此 url:people.eecs.berkeley.edu/~rcs/research/interactive_latency.html
  • 目前似乎无法在 c / c++ 中创建 1 位大小的元素数组。我会接受你的回答。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多