问题标签 [std-bitset]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
108 浏览

c++ - 使用 std::bitset 计算有限集的子集

我想检查集合 [1, ..., 15] 的子集 S 有多少,因此不可能从 S 中选择两个元素,使得它们的和是 3 的倍数。

检查这一点的算法如下:在 [1, ..., 15] 的子集和长度为 15 的两个字符的字符串之间存在自然双射(假设两个字符是 '0' 和 '1'修正一个约定),其中位置 i 中的字符“0”表示整数 i 不在子集中,而位置 i 中的字符“1”表示整数 i 在子集中。例如,字符串“111001000000000”与子集 {1, 2, 3, 6} 相关联。该子集不满足上述约束。

我编写了一个 C++ 代码来生成所有此类字符串,将它们转换为 1 到 15 之间的整数向量,并检查该集合中的所有对是否存在总和为 3 的倍数的对。

这是代码:

问题是我的代码返回 373,这是错误的答案(正确的应该是 378)。我想我在这里做错了什么,但我在我的代码中找不到错误。

0 投票
1 回答
182 浏览

c++ - 如何在不使用 to_string 或逐个提取位的情况下提取大于 unsigned long long 的位集子集?

我想从给定的位集中提取一个子集,其中:

  1. G(给定的位集大小)和S 子集大小)在编译时都是已知的

  2. G > sizeof(unsigned long long) * 8

  3. 小号 <= sizeof(int) * 8

  4. 子集可以从给定位集中的任何位置开始

  5. 结果子集应该是正确大小的位集,S


我可以使用按位数学隔离子集,但bitset.to_ullong由于溢出错误而无法工作。

我知道我可以使用bitset.to_string并进行字符串操作/转换。我目前正在做的是手动逐个提取位(这对我的用例来说已经足够了)

我只是想知道是否还有其他方法可以做到这一点。

0 投票
1 回答
149 浏览

c++ - 关于比特流可能的未来 C++ 语言或标准库功能的一般问题

bitstream在 C++ 20 之后的 C++ 未来版本中或在标准库中是否有提及具有特定对象?例如; 我们可以有一个std::bitset<n>对象,其中n是一个常数已知的整数值。

伪示例:

这里我们有一个类模板,它将指定对象中有多少位std::bitset。这很好。

我们也有stream诸如iostreamfstreamsstream等对象,我们可以将各种数据类型的值输入这些流,读取或写入字符串流、文件流、控制台或终端的 I/O 流等。 ..


我想知道的是,是否有任何建议具有像上面那样的流对象,但特定于类似于性质的任意位序列std::bitset,您可以将一组位输入到流中。例如,它可能看起来像这样:

这里的预期输出将是:

根据预期用途的字节序表示法...


逆转也适用。如果我们有一个已经填充的bitstream对象,例如上面示例中的对象,我们可以从以下示例中提取特定的位序列bitstream

并且预期的结果将分别从 MSB 或 LSB 方向拉取bitset对象大小的数量。


就像iostream其他流库一样,通过使用该<iomanip>库,我们可以拥有格式修饰符,可以将此输入或输出分解bit-segments为任何指定长度的离散值,例如每 4 或 8 位,或将其显示为十六进制等......位操作和计算仍然是std::bitset.

能够在与所有其他类似对象兼容的对象bitset中推入或检索任意对象可能是一个非常强大且有用的工具或功能。bitstreamstream

有没有提到这样的东西,或者是否已经存在类似于这种性质的东西,而不必在字符串或其他类型之间来回转换等?


EDIT -User- walnut在他的回答中给出了一些很好的例子,并且已经可以使用现有的iostream对象和运算符来完成。您可以阅读他的回答和讨论中的评论,但是,我只是想说明我对一个stream对象库的推理,该对象库被编写和设计为明确且专门用于bitset数据类型。

想象一个这样的函数:

并比较一下...

调用者,用户将知道它正在返回一个bitstream显式或专门与任意对象进行比较的stream对象!这是我的主要意图或目标......它更倾向于可读性,并且在显示正确意图的代码中更具表现力。此外,它将与bitset对象紧密耦合,这意味着bitstream对象将只接受来自bitsets 或其他bitstream对象的数据,但它可以将其数据传递给bitsets、bitstreams 或其他stream对象。

0 投票
2 回答
1019 浏览

c++ - 使用 scanf/printf 从 bitset 输入/输出

我对 C++ 有点陌生,我想知道如何从 bitset 中 scanf 或 printf,即,对于 bitset 索引的 I/O 合适的类型说明符是什么?我想做的一个例子是:

0 投票
1 回答
101 浏览

c++ - 如何在 C++ 中的堆上使用 bitset?

如果我在堆栈上使用 bitset,我可以执行以下操作:

输出:

但是当我尝试在堆上分配位集时:

输出:

如果我尝试访问第二个位,我会得到一个空的 Bitset 而不是“1”。我究竟做错了什么?

0 投票
1 回答
95 浏览

c++ - Linux API 读/写和 c++ 位集

如何使用具有 Linux API 读/写功能的 C++ 位集容器?

像这样的东西:

我们可以不使用向量容器而立即编写位集吗?

0 投票
1 回答
33 浏览

c++ - 公开一个类内部的私有 std::bitset 字段以进行修改

我正在编写一个尚未超越 C++11 的 C++ 项目。

假设我有一个enum class如下:

我想创建一个具有私有std::bitset字段的类,该字段跟踪哪些工作日是特殊的。这个类也做了很多其他的事情,所以我不能或不应该std::bitset<7u>直接使用。所以我定义:

我想使用这个类的方式如下

那么我必须在 (*) 处插入什么才能使用这样的类?特别是,我想将 (!) 分配给obj[kTuesday]并获得这样的效果,即在内部obj,该字段_specialflags[static_cast<size_t>(kTuesday)]被相应地修改。所以像

inline bool operator[](Weekdays d) const { return _specialflags[static_cast<size_t>(d)]; }

还没剪;它公开各个位以供读取但不用于写入。

0 投票
2 回答
110 浏览

c++ - 如何有效地翻转 C++ 中的部分数字/位集?

考虑我有一个100101长度为 6 的数字。我希望从位置 2 到 5 翻转位,所以我的答案是111011. 我知道我可以在一个循环中翻转单个位。但是有没有一种有效的方法可以在没有 for 循环的情况下做到这一点?

0 投票
1 回答
55 浏览

c++ - C++ 入门第 5 版:表示整数序列的位集

我在 C++ Primer 5th edition 这个练习中被问到:

练习 17.10:使用序列 1, 2, 3, 5, 8, 13, 21,初始化在每个位置bitset都有一个1位对应于该序列中的数字的 a。默认初始化另一个bitset并编写一个小程序来打开每个适当的位。

事实上,我几乎解决了本书的所有练习,但我无法理解这一点。我明白了std::bitset

我找到了这样的解决方案:

但我不知道这是怎么回事以及它是如何工作的?如果正确,请帮助我理解这一点。太感谢各位了!

我不明白这样怎么能1000000010000100101110代表序列1, 2, 3, 5, 8, 13, 21

0 投票
0 回答
272 浏览

c++ - C++ 中 std::bitset 的算术运算

我今天在这里向您请教一些关于我如何std::bitset以正确的方式处理大事的明智提示。具体来说,我必须管理 256 位(甚至更多)的位集,并且在我需要执行经典的二进制操作之前,我不会遇到麻烦。当我需要在位集之间执行减法时,就会出现问题。通常,我会用to_ulong()or翻译它们to_ullong(),执行减法并重新翻译成 bitset,但n_bits > 64bit事情并不像以前那么容易。

所以,我在这里问你是否有办法以另一种方式在 bitset 之间执行减法。我知道它也存在一个(或更多?)BigNum C++ 库,但我正在寻找可以在不添加外部库的情况下完成的事情。我认为使用 lib 是解决此问题的最后可能方法。

谢谢!