我正在学习关于操作系统的大学课程,我们正在学习如何从二进制转换为十六进制,十进制到十六进制等等.今天我们刚刚学习了如何使用二进制补码(〜数字)将有符号/无符号数存储在内存中+ 1).
我们在纸上做了几个练习,我希望能够在向老师提交作业之前验证我的答案.我为前几个练习编写了一个C++程序,但现在我不知道如何通过以下问题验证我的答案:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
Run Code Online (Sandbox Code Playgroud)
我们需要在内存中显示二进制表示a,b和c.
我已经在纸上完成了它,它给了我以下结果(在二进制补码后的数字内存中的所有二进制表示):
a = 00111010(它是一个字符,所以1个字节)
b = 00001000(它是一个字符,所以1个字节)
c = 11111110 11000101(它是一个短的,所以2个字节)
有没有办法验证我的答案?在C++中是否有一种标准方法可以在数字的内存中显示二进制表示,或者我是否必须自己编写每个步骤(计算二进制补码然后转换为二进制)?我知道后者不会花那么长时间,但我很好奇是否有一种标准的方法可以做到这一点.
第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 ++一直没有遵循这个规范.
这种不合格的动机是什么?
似乎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中排除迭代器?
我编写了以下代码片段,将两种状态的字符串 ("+++--+-"或"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)
是否有更算法和/或更优雅的方法来进行此类转换?
嗨我正在处理要求我访问特定/范围位的东西.我决定使用bitset,因为它很容易访问特定的位,但我能提取整个范围的位吗?
我最近遇到了bitset模板,并且非常想在我当前的项目中使用它们.继续阅读,我发现std::bitset模板必须具有在编译时确定的大小.许多人建议使用它boost::dynamic_bitset来缓解这一要求.
比较两个,我决定做的速度比较set,flip和count方法.
结果很奇怪......我想知道是否有人可以为我阐明它.
代码在帖子的末尾,但我会解释我在这里做的事情.我有一个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) 目前我正在使用枚举代表一个小游戏实验中的状态.我声明他们是这样的:
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,这是我应该用的吗?你知道更高效的东西吗?
我做得对吗? …
我有一个std::bitset和bitset类型也提供了一个to_ulong方法来将bitset转换为数字,我的问题是关于将bitset转换为数字而只考虑该bitset中的一个范围,我需要实现我自己的powerof2函数或者有一些东西采用更标准的方法?
我知道已经构造的bitset对象的set()函数,但我需要一个构造的bitset,所有位都是1.这种情况是一个默认的函数参数.例如:
void bar(std::bitset<100> flags = X) {
}
Run Code Online (Sandbox Code Playgroud)
X应该是什么,-1可能适用于前64位,但不是全部.
我的猜测是O(n),其中n是no.比特.或者它是不变的?我的意思是它不应该只能从内存中复制这些位吗?