标签: std-bitset

如何打印(使用cout)数字存储在内存中的方式?

我正在学习关于操作系统的大学课程,我们正在学习如何从二进制转换为十六进制,十进制到十六进制等等.今天我们刚刚学习了如何使用二进制补码(〜数字)将有符号/无符号数存储在内存中+ 1).

我们在纸上做了几个练习,我希望能够在向老师提交作业之前验证我的答案.我为前几个练习编写了一个C++程序,但现在我不知道如何通过以下问题验证我的答案:

char a, b;

short c;
a = -58;
c = -315;

b = a >> 3;
Run Code Online (Sandbox Code Playgroud)

我们需要在内存中显示二进制表示a,bc.

我已经在纸上完成了它,它给了我以下结果(在二进制补码后的数字内存中的所有二进制表示):

a = 00111010(它是一个字符,所以1个字节)

b = 00001000(它是一个字符,所以1个字节)

c = 11111110 11000101(它是一个短的,所以2个字节)

有没有办法验证我的答案?在C++中是否有一种标准方法可以在数字的内存中显示二进制表示,或者我是否必须自己编写每个步骤(计算二进制补码然后转换为二进制)?我知道后者不会花那么长时间,但我很好奇是否有一种标准的方法可以做到这一点.

c++ binary iostream representation std-bitset

194
推荐指数
6
解决办法
25万
查看次数

为什么libc ++的vector <bool> :: const_reference不是bool?

第23.3.7节vector<bool>[vector.bool]第1段规定:

template <class Allocator> class vector<bool, Allocator> {
public:
    // types:
    typedef bool              const_reference;
    ...
Run Code Online (Sandbox Code Playgroud)

但是,当使用libc ++时,此程序无法编译:

#include <vector>
#include <type_traits>

int
main()
{
    static_assert(std::is_same<std::vector<bool>::const_reference, bool>{}, "?");
}
Run Code Online (Sandbox Code Playgroud)

此外,我注意到C++标准在本规范中一直与C++ 98一致.我还注意到自从第一次引入libc ++以来,libc ++一直没有遵循这个规范.

这种不合格的动机是什么?

c++ vector c++-standard-library libc++ std-bitset

91
推荐指数
1
解决办法
4797
查看次数

为什么std :: bitset没有迭代器?

似乎std :: bitset没有STL迭代器.
因此,我不能做到以下几点:

std::bitset<8> bs;
for (auto it: bs) {
    std::cout << "this can not be done out of the box\n";
}
Run Code Online (Sandbox Code Playgroud)

相反,我必须:

std::bitset<8> bs;
for (std::size_t i = 0; i < bs.size(); ++i) {
    std::cout << bs[i] << '\n';
}
Run Code Online (Sandbox Code Playgroud)

没有迭代器,我也不能将bitset与任何STL算法一起使用.
为什么委员会决定从bitset中排除迭代器?

c++ iterator stl bitset std-bitset

24
推荐指数
1
解决办法
5444
查看次数

有没有比仅通过“for”循环更优雅的方法将两种状态字符串转换为位集?

我编写了以下代码片段,将两种状态的字符串 ("+++--+-""yynnny") 转换为std::bitset

#include <bitset>
#include <cstddef>
#include <string>
#include <iostream>

std::bitset<70> convertTwoStateString(std::string twoState)
{
    std::bitset<70> a{0b0};
    std::bitset<70> eins{0b1};

    for(const auto c : twoState) {
        if(c == '+') {
            a <<= 1;
            a |= eins;
        }
        if(c == '-') {
            a <<= 1;
        }
    }
    return a;
}


int main()
{
    std::string s{"-+--+++--+--+"};
    std::bitset<70> set = convertTwoStateString(s);

    std::cout << set << std::endl;
    //0000000000000000000000000000000000000000000000000000000000100111001001
}
Run Code Online (Sandbox Code Playgroud)

是否有更算法和/或更优雅的方法来进行此类转换?

c++ std-bitset

21
推荐指数
1
解决办法
1912
查看次数

在bitset中,我可以对特定的位范围使用"to_ulong"吗?

嗨我正在处理要求我访问特定/范围位的东西.我决定使用bitset,因为它很容易访问特定的位,但我能提取整个范围的位吗?

c++ bitset std-bitset

13
推荐指数
1
解决办法
2006
查看次数

除非std :: bitset被重置,否则boost :: dynamic_bitset比std :: bitset慢

我最近遇到了bitset模板,并且非常想在我当前的项目中使用它们.继续阅读,我发现std::bitset模板必须具有在编译时确定的大小.许多人建议使用它boost::dynamic_bitset来缓解这一要求.

比较两个,我决定做的速度比较set,flipcount方法.

结果很奇怪......我想知道是否有人可以为我阐明它.

代码在帖子的末尾,但我会解释我在这里做的事情.我有一个std::bitset对象(称之为bs)和一个boost::dynamic_bitset对象(称之为dynbs).每个都有n=1000000位.对于上面给定的方法,n按顺序调用每个位上的方法并重复此次R=10000.

使用该std::chrono库,以下是每纳秒的时间:

set
        bitset:              267 nsecs
    dyn bitset:      18603174546 nsecs

flip
        bitset:               73 nsecs
    dyn bitset:      18842352867 nsecs

count
        bitset:               77 nsecs
    dyn bitset:               51 nsecs
Run Code Online (Sandbox Code Playgroud)

boost::dynamic_bitset对于set和,似乎要慢得多flip.

为了使它更有趣,如果reset在运行这些测试之前在两个对象上调用该方法,那么时序是可比较的.他们来了:

set
        bitset:      19397779399 nsecs
    dyn bitset:      18472863864 nsecs

flip
        bitset:      18599248629 nsecs
    dyn bitset:      18376267939 nsecs …
Run Code Online (Sandbox Code Playgroud)

c++ boost-dynamic-bitset std-bitset

13
推荐指数
1
解决办法
1万
查看次数

enum是实现位标志的规范方法吗?

目前我正在使用枚举代表一个小游戏实验中的状态.我声明他们是这样的:

namespace State {
  enum Value {
    MoveUp = 1 << 0, // 00001 == 1
    MoveDown = 1 << 1, // 00010 == 2
    MoveLeft = 1 << 2, // 00100 == 4
    MoveRight = 1 << 3, // 01000 == 8
    Still = 1 << 4, // 10000 == 16
    Jump = 1 << 5
  };
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以这样使用它们:

State::Value state = State::Value(0);
state = State::Value(state | State::MoveUp);
if (mState & State::MoveUp)
  movement.y -= mPlayerSpeed;
Run Code Online (Sandbox Code Playgroud)

但我想知道这是否是实现位标志的正确方法.是否有特殊的容器标志容器?我听说过std::bitset,这是我应该用的吗?你知道更高效的东西吗?
我做得对吗? …

c++ enums bit-manipulation bitflags std-bitset

11
推荐指数
3
解决办法
7173
查看次数

如何将C++位集中的范围子集转换为数字?

我有一个std::bitset和bitset类型也提供了一个to_ulong方法来将bitset转换为数字,我的问题是关于将bitset转换为数字而只考虑该bitset中的一个范围,我需要实现我自己的powerof2函数或者有一些东西采用更标准的方法?

c++ bitset std-bitset

9
推荐指数
1
解决办法
3116
查看次数

如何将bitset类型的所有位初始化为1

我知道已经构造的bitset对象的set()函数,但我需要一个构造的bitset,所有位都是1.这种情况是一个默认的函数参数.例如:

void bar(std::bitset<100> flags = X) {
}
Run Code Online (Sandbox Code Playgroud)

X应该是什么,-1可能适用于前64位,但不是全部.

c++ std-bitset

8
推荐指数
2
解决办法
7149
查看次数

从long转换的C++ bitset构造函数的复杂性是什么?

我的猜测是O(n),其中n是no.比特.或者它是不变的?我的意思是它不应该只能从内存中复制这些位吗?

c++ time-complexity bitset std-bitset

7
推荐指数
1
解决办法
230
查看次数