【问题标题】:How can I simulate binary values using a vector of booleans in C++?如何在 C++ 中使用布尔向量模拟二进制值?
【发布时间】:2021-05-17 10:57:50
【问题描述】:

我希望能够在我的向量中保留相同数量的bits,同时仍然执行二进制加法。例如。

int numOfBits = 4;
int myVecVal = 3;
vector< bool > myVec;
GetBinaryVector(&myVec,myVecVal, numOfBits);

它的输出是:

{0, 0, 1, 1}

我不知道如何制作GetBinaryVector 的功能,有什么想法吗?

【问题讨论】:

  • 它需要保留相同大小的位,而不是将它们调整为值的大小。即,30 的值将具有 5 的大小,不多不少。或者除非我指定了它的大小,否则我也可以有一个 30 的值,但例如 100 的大小。 @AllanWind
  • 溢出时会发生什么?
  • 没什么,它可能会崩溃,或者它应该只是全 1,(无符号整数)。对我的用例来说真的没关系

标签: c++ vector binary


【解决方案1】:

这似乎有效(尽管我在初始评论中添加的文章似乎建议您只有字节级访问权限):

void GetBinaryVector(vector<bool> *v, int val, int bits) {
    v->resize(bits);
    for(int i = 0; i < bits; i++) {
        (*v)[bits - 1 - i] = (val >> i) & 0x1;
    }
}

左侧设置第 i 个最低有效位,即索引 bits - 1 - i。右侧通过将值向下移动第 i 位并屏蔽除最低有效位以外的所有内容来隔离第 i 个最低有效位。

在您的示例中,val = 8bits = 15。在第一次迭代中i = 0:我们有(*v)[15 - 1 - 0] = (8 &gt;&gt; 0) &amp; 0x18 是二进制的 1000 并将其向下移动 010001000 &amp; 0x10。让我们跳转到i = 4(*v)[15 - 1 - 4] = (8 &gt;&gt; 4) &amp; 0x11000 &gt;&gt; 411 &amp; 0x11,所以我们设置 (*v)[10] = 1。结果向量为{ 0, ..., 0, 1, 0, 0, 0 }

【讨论】:

  • 我输入了 15, 8,它给了我二进制值 15 的倒数
  • 更新了分配以使用 bits-i 代替。试一试。
  • 对不起,我的错,位就像一个长度,并将其用作索引,所以需要 [bits - 1 - i]。
  • 为什么要传递一个指向向量的指针而不是只返回一个?
  • 原始问题在调用时将 &myVec 作为第一个参数。
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
相关资源
最近更新 更多