2017-04-06 43 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