我正在通过Stanley Lippman的书来学习C ++。我正在研究名为“类Bitset”的段落。有一个练习,他给我数字序列以转换成bitset< 32>。
数字序列为:1,2,3,5,8,13,21。我可以问你,我的代码是否适合表示这个数字序列? Lippman还希望我使用bitset中的每个位来表示序列,但是bitset可以存储多于1的值吗?我第一次这样做,我唯一的想法是:
int index = 0;
const int size_ = 7;
unsigned long f2[size_];
int main()
{
setlocale(LC_ALL,"rus");
string try1;
cout << "Type your numerical sequence in binary code: " << endl;
while (cin >> try1) {
bitset<32> go(try1);
if ( go.to_ulong() > 21 ) { cout << "End of sequence" << endl; break; }
f2[index] = go.to_ulong();
index++;
try1.clear();
go.reset();
}
for ( index; index >= 0; index-- ) {
cout << f2[index] << " ";
}
system("pause");
return 0;
}
答案 0 :(得分:0)
你可能正在寻找这样的东西:
#include <bitset>
#include <iostream>
int main()
{
std::bitset<32> my_bitset;
for (auto position : { 1, 2, 3, 5, 8, 13, 21 })
{
my_bitset.set(position, true);
}
// Initialize with "default" bitset mask
std::bitset<32> another_bitset(my_bitset.to_ulong());
for (auto bit = 0u; bit < another_bitset.size(); ++bit)
{
std::cout << "bit no. " << bit << " is " << (another_bitset.test(bit) ? "" : "not ") << "set" << std::endl;
}
return 0;
}
答案 1 :(得分:0)
是否bitset可以存储多于1个值?
嗯,是的 - 这是一组比特,因此得名。每个位都可以打开或关闭,这可以被视为一个“值”。因此,std::bitset<32>
可以在其中编码32个“值”。最终,整个bitset本身一次只有一个值,但这就是“编码”数据的美妙 - 每个值都由较小的构建块组成。要解决此问题,您需要记住计算机上存储的每个值都包含一系列位。
据推测,您应该通过设置位置x,y,...,z
的位来对序列x,y,...,z
进行编码。为此,您可以使用函数set
。
例如,一旦你设置了1,2,3,5,8,13,21位(我假设这里有一个基于0的系统,那么你可以支持输入0
) ,你的bitset将“包含”:
#0 #4 #8 #12 #16 #20 #24 #28 #32
+----+----+----+----+----+----+----+----+
|0111 0100 1000 0100 0000 0100 0000 0000|
+-^^^+-^--+^---+-^--+----+-^--+----+----+
||| | | | |
当从二进制转换为十进制时,此序列的编号为1,954,808,832,如果您随后在bitset对象上调用to_ulong()
,这正是您所获得的。
在您的代码中,您为每个输入的值创建一个新的bitset,这是无用的;你的实际存储只是一个unsigned long
的数组,这与练习的精神不一致(而是使用bitset
代替存储)。你也在对象超出范围之前(在循环体的末尾)调用reset()
,它什么也没做。