问题标签 [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 投票
2 回答
643 浏览

c++ - 使用 std::bitset 的联合成员进行结构填充

在我解决了这个问题的问题后,我继续扩展我的代码的这个版本,以将我以前的模板版本中的数据字段的联合与这个版本合并,到目前为止我有这个:

主文件

寄存器.h

注册.cpp

输出

在查看bitset类型大小的打印输出数据后,将它们与它们作为联合中结构成员的实际大小进行比较。我试图弄清楚这里发生了什么。

我不确定我是否正确执行 sizeof 计算是否与内部存储bitset有关类型是std::bitset类型的。从标题中您可以看到这些有 4 种变体:bitset<8> = Byte, bitset<16> = Word, bitset<32> = DWord&bitset<64> = QWord

本质上应该有这些的可分割映射:

因此,当我尝试在联合中使用它们时:

我认为通过使用我在此联合上方显示的模式,我可以将数据打包成字节大小对齐:

然而,这似乎并没有像我预期的那样发生。

我的总体目标是模拟上面我表达的模式,以便寄存器的基本大小为 64 位或 8 字节宽,并且通过使用联合,我将能够从完整的 qword 访问子字节、字或双字.

您能否详细说明我在这里缺少的内容?我不确定它是否与如何std::bitset存储在内存中有关,是否与结构对齐有关,或者是否与联合本身有关。

0 投票
1 回答
57 浏览

c++ - 为什么位模式与使用 std::bitset 不匹配

当我对我的类及其构造函数进行单元测试时,我注意到我的输出有些特殊。

这是我的输出来自运行 Windows 7 x64 并在 x64 调试模式下使用 Visual Studio 2017 CE 的 little endian 机器和 Intel Quad Core Extreme,编译器语言选项设置为 c++ 最新草案标准。所有其他编译器标志 - 优化等 Visual Studio 的默认值。

那么为什么类构造中的位模式与 main 中声明的位模式不匹配呢?

我使用相同的变量类型和值来初始化 main 中的 bitset 以及我班级中的 bitset,但它们的位模式不匹配。班里的都一样,班外的都一样。

我期望看到的和我想要的值应该是 main.js 中看到的值。当我查看输出的下半部分时,main 中的这些 bitset 变量的值为 24,并且它们的位模式与 8 位的 24 匹配。

但是,存储在我的类中的位集中的位模式不匹配,但包含适当的值。存储在我的班级中的位集具有位模式

这里发生了什么?

0 投票
1 回答
280 浏览

c++ - 如何转换 std::bitset到 std::bitset?

如果我有std::bitset<16>,如何将其转换为std::bitset<32>高位填充 0 的?

0 投票
2 回答
165 浏览

c++ - constexpr 用于通过引用传入的值

我有这段代码可以编译

但这并不

失败并出现此错误

为什么a.b.size()在第二种情况下不被视为 constexpr ?是不是应该根据参考被视为 const 的constexpr那个?还是在第二种情况下传递的非常量引用会触发编译器生成错误?std::bitset::size()

编译器版本:Ubuntu 14.0.4 上的 g++ 4.8.4,编译时使用g++ const.cpp -std=c++1y

0 投票
0 回答
97 浏览

c++ - Bitset 作为构造函数参数

我对 std::bitset 的理解有问题。我想使用 bitset 作为多个功能的开关。

想象一下 A 类和函数 Func1。构造函数看起来像这样 A(bool procFunc)。用法很简单。如果我想使用 Func1,我将通过 true,否则为 false。简单的。我有多种选择,一个 bool 是不够的,所以我想使用 std::bitset。

非常非常简单的草稿:

如果我只有 Func1。我会这样打开:

但我不知道如何准确地使用 std::bitset 进行多项选择。我想定义一些枚举或类似的东西并定义0001调用Func1()...... 0010调用Func2()...... 0100调用Func2()...... 1000调用Func4()。

谢谢你的帮助。

0 投票
1 回答
152 浏览

c++ - 我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset

我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset。结果,程序仅填充了我的 RAM 的 298 MB,但必须填充〜 24 GB。我有 32 GB RAM,现在 26 GB 是免费的。当我为 x86 构建代码时,它可以编译并且可以启动,但对于 x64,它会显示以下内容:错误 C2148:数组的总大小不得超过 0x7fffffff 字节。如何修复它并且不减小位集数组的大小?

我试图制作 2 个全局数组。另外,我在 Microsoft Visual Studio -> 项目 -> name_project 属性 -> 配置属性 -> 链接器 -> 系统 -> 堆栈保留大小设置为 25,000,000(我认为必须有 KB,所以我认为我已设置为 ~ 25 GB)。

我想用巨大的 std::bitset 数组运行代码。

UPD:对于 x86 可以,但是对于 x64 呢?我的代码检查整个数组,并在某一时刻停止。

0 投票
1 回答
57 浏览

c++ - 努力创建一个包含 std::bitset 的 Boost-Bimap

我有许多字符串及其等效的位集。我需要能够在两个方向上查找等价物,即“ str to bitset ”和“ bitset to str ”。我相信 boost-bimap 将是这项工作的正确容器。

我设法让它与字符串和整数一起使用,但我的字符串/位集 bimap 无法编译。我正在使用带有最新增强版本的 VS2019。

整数示例有效:

Bitset 示例无法编译:

bitset 示例会产生以下编译器错误:

boost_test.cpp(20): message : 请参阅正在编译的类模板实例化 'boost::bimaps::bimap' 的引用

我不知道如何解决这个问题,非常感谢任何提示。

0 投票
1 回答
481 浏览

c++ - C++ 位集参考

关于位集参考的两个问题:

Q1。有什么方法可以返回一个类私有成员位集?在下面的代码片段(后面是输出)中,我尝试了常规引用,但它甚至不会修改 Foo 类中的 bitset 成员。

Q2。从这个问题的答案中,我了解到常规引用没有足够的粒度来指向存储的单个位,bitset因为bitset它们以更紧凑的形式存储。但是,如果这是真的,我的代码如何仍然设法修改 b3 中的第一位b3[1] = 0

0 投票
1 回答
147 浏览

c++ - 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?

我正在实施埃拉托色尼筛。我被困在第一步:决定使用哪种数据结构。简而言之,埃拉托色尼筛法以一系列连续数字(例如 2、3、4、5、...99、100)开始。然后,某些数字被划掉,不再考虑。什么是最好的数据结构?限制(示例中为 100)直到运行时才知道,尽管 2 始终是起始数字。

我已经看到了一些不同的解决方案。限制n是类型mpz_class

  • bool primes[n]
  • bool* primes
  • std::vector<bool> primes
  • std::bitset<n> primes
  • vector使用参数int,或者unsigned char因为它们会比bool
  • 对于基于向量和数组的解决方案,分配n+1元素(如此处所示)我猜这是这样的值n将在最后一个元素处,并且在循环内需要更少的减法。

其中一些信息来自此代码审查问题。@Jamal 声明“实际上存在与 std::vector 相关的问题”,但没有详细说明。我也在某处红色,unsigned char保证其大小等于或小于使其 bool成为更好的选择。

0 投票
1 回答
113 浏览

c++ - Float to 4 uint8_t and display

I read from float in Wikipedia and i tried print his bits. i used std::bitset and this return other bits different from what I expected(i know because i used the same number of the example in the link), then i used memcpy() and copy the memory of float to 4 parts of 1 byte each and print, this method worked but i have 4 questions.

1) Why using bitset in a float, this print only the integer part?
2) Why bitset working only with the array and not with the float?
3) memcpy() worked in correct order?

The last question is because 0.15625f == 0b00111110001000000000000000000000.
Then i think that the correct order is:

But the order returned is inverse.

4) Why happend this ?

My code: