让我们假设我有一组我要转换成int
的位,但这些位可能代表负2的补码,例如:< / p>
vector<bool> foo = { true, false, false, false, false, true, false, false }
显然,如果设置foo.front()
,则数字为负数。将此转换为int
的最佳方式是什么?
这个问题似乎缺乏明确性。作为参考,我在这里添加了我的暴力解决方案:https://stackoverflow.com/a/50108264/2642059我想完成同样的事情,但理想情况下提供一些功能,而不是那么多hackery。
答案 0 :(得分:1)
name
答案 1 :(得分:0)
在两个补码表示法中,数字的负数是补码加1。
当foo.first() == true
时,将所有剩余的元素转换为二进制数字,然后将其反转并添加1.然后返回负数。
因此,在您的示例中,其余元素对应于二进制数0000000
。补充为1111111
,127
。添加1
,然后获得128
,然后返回-128
。实际上,值-128
在8位二进制补码中表示为10000000
。
用于此过程的签名数据类型需要至少比向量大1位,以避免在向#34添加1时溢出;所有位设置为&#34;值。因此,如果您的向量最多可包含32个元素(包括符号),则需要使用int64_t
。
答案 2 :(得分:0)
可以通过执行以下操作生成数字的前导设置位,包括应为foo.front()
设置的位:-(1 << size(foo) - 1)
。在此之后,您只需要移动剩余的位。
例如,无论是否设置foo.front()
,都会生成正确的数字:
int i = size(foo) - 1;
const auto bar = accumulate(next(cbegin(foo)), cend(foo), foo.front() ? -(1 << i) : 0, [&](const auto val, const auto it) { return val + (it << --i); });