2017-04-06 59 views
0

我正在学习C++在Stanley Lippman的书上。我正在研究名为“class Bitset”的段落。有一个练习,他给我的数字序列转换成bitset < 32>。bitset和数字序列C++

数值序列为:1,2,3,5,8,13,21。我可以问你,我的代码是否适合这种数字序列? Lippman还希望我使用bitset中的每一位来表示序列,但bitset是否可以存储多于一个值?林做第一次和我得到的唯一的想法是:

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; 
} 
+1

你不是应该设置位1,2,3,5,8,13和21吗? – molbdnilo

+0

给出序列:1,2,3,5,8,13,21。我如何初始化 的对象位集<32>来表示它?如何分配值以将 这个序列表示为空位矢量?写入初始化选项 ,并为每个位分配一个值的变体 – FishTheBig

+0

在这里,我真的不明白他要求我做什么 – FishTheBig

回答

0

是位集可以在其中存储超过1倍的值?

嗯,是的—这是一组位,因此名称。每一位都可以打开或关闭,这可能被认为是一个“价值”。因此,std::bitset<32>可以在其中编码32个“值”。最终,整个bitset本身一次只有一个值,但这就是“编码”数据的优点。每个值都由较小的构建块组成。为了解决这个问题,你需要记住的是,存储在你的计算机上的值由一系列位组成。

大概你应该通过在位置x,y,...,z设置位来编码序列x,y,...,z。为此,您可以使用功能set。例如,一旦你设置了位1,2,3,5,8,13,21(并且我假设这里是一个基于0的系统,这样你就可以支持输入0),那么你的位集将“含有”:

#0 #4 #8 #12 #16 #20 #24 #28 #32 
+----+----+----+----+----+----+----+----+ 
|0111 0100 1000 0100 0000 0100 0000 0000| 
+-^^^+-^--+^---+-^--+----+-^--+----+----+ 
    ||| | |  |   | 

当从二进制转换成十进制,这个序列是多少1954808832,而这正是你会得到什么,如果你再调用to_ulong()位集对象。

在您的代码中,您将为输入的每个值创建一个新的bitset,这是无用的;您的实际存储空间只是unsigned long的数组,这不符合练习的精神(而是使用bitset代替存储)。在对象超出范围之前(在循环体的末尾),您也会调用reset(),它什么都不做。

+0

谢谢你的队友。 :) – FishTheBig

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; 
} 
+0

我不明白第二个bitset的目的。 –

+0

这是“练习17.10”的第二部分 - 你应该创建另一个bitset并初始化它的默认值。有几种方法可以设置/取消设置/初始化位设置,本练习可帮助您熟悉其中的一些设置。 –

+0

感谢您的帮助bro – FishTheBig