位集和数字序列 C++
bitset and numerical sequence C++
我正在通过 Stanley Lippman 的书学习 C++。我正在研究名为 "class Bitset" 的段落。有一个练习,他给了我要转换成 bitset<32> 的数字序列。
数字顺序为:1,2,3,5,8,13,21。我可以问你我的代码是否适合 peresent 这个数字序列? 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;
}
您可能正在寻找这样的东西:
#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;
}
is bitset can store more than 1 value in it?
嗯,是的——它是一组位,因此得名。每个位可以开或关,可以认为是一个"value"。因此,a std::bitset<32>
可以在其中编码 32 "values"。最终,整个位集本身一次只有一个值,但这就是 "encoding" 数据的美妙之处——每个值都由更小的构建块组成。要解决这个问题,您需要记住,存储在计算机上的每个 值都由一系列位组成。
假设您应该通过在位置 x,y,...,z
处设置位来对序列 x,y,...,z
进行编码。为此,您可以使用函数 set
.
例如,一旦您设置了位 1、2、3、5、8、13、21(我在这里假设一个基于 0 的系统,以便您可以支持输入 0
), 你的位集将 "contain":
#0 #4 #8 #12 #16 #20 #24 #28 #32
+----+----+----+----+----+----+----+----+
|0111 0100 1000 0100 0000 0100 0000 0000|
+-^^^+-^--+^---+-^--+----+-^--+----+----+
||| | | | |
当从二进制转换为十进制时,此序列为数字 1,954,808,832,这正是您随后对 bitset 对象调用 to_ulong()
时将得到的结果。
在您的代码中,您改为为每个输入的值创建一个新的位集,这是无用的;你的实际存储只是一个unsigned long
的数组,这不符合练习的精神(而是使用bitset
来存储)。您还在对象超出范围之前(在循环体的末尾)调用 reset()
,这什么都不做。
我正在通过 Stanley Lippman 的书学习 C++。我正在研究名为 "class Bitset" 的段落。有一个练习,他给了我要转换成 bitset<32> 的数字序列。
数字顺序为:1,2,3,5,8,13,21。我可以问你我的代码是否适合 peresent 这个数字序列? 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;
}
您可能正在寻找这样的东西:
#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;
}
is bitset can store more than 1 value in it?
嗯,是的——它是一组位,因此得名。每个位可以开或关,可以认为是一个"value"。因此,a std::bitset<32>
可以在其中编码 32 "values"。最终,整个位集本身一次只有一个值,但这就是 "encoding" 数据的美妙之处——每个值都由更小的构建块组成。要解决这个问题,您需要记住,存储在计算机上的每个 值都由一系列位组成。
假设您应该通过在位置 x,y,...,z
处设置位来对序列 x,y,...,z
进行编码。为此,您可以使用函数 set
.
例如,一旦您设置了位 1、2、3、5、8、13、21(我在这里假设一个基于 0 的系统,以便您可以支持输入 0
), 你的位集将 "contain":
#0 #4 #8 #12 #16 #20 #24 #28 #32
+----+----+----+----+----+----+----+----+
|0111 0100 1000 0100 0000 0100 0000 0000|
+-^^^+-^--+^---+-^--+----+-^--+----+----+
||| | | | |
当从二进制转换为十进制时,此序列为数字 1,954,808,832,这正是您随后对 bitset 对象调用 to_ulong()
时将得到的结果。
在您的代码中,您改为为每个输入的值创建一个新的位集,这是无用的;你的实际存储只是一个unsigned long
的数组,这不符合练习的精神(而是使用bitset
来存储)。您还在对象超出范围之前(在循环体的末尾)调用 reset()
,这什么都不做。