2012-04-04 97 views
0

我試圖編寫一個算法,將一個範圍內的每個整數保存爲文件作爲二進制字符串。例如,對於範圍0到7:C++將一個整數轉換爲一個布爾數組的算法

0 0 0 
0 0 1 
0 1 0 
0 1 1 
1 0 0 
1 0 1 
1 1 0 
1 1 1 

請注意,數字之間的前導零和空格是必不可少的。

我不知道如何做一個簡單的方法是將整數轉換爲由bool [] s(或一些替代方法)表示的二進制數。

編輯

按照要求,我的解決方案迄今:

const int NUM_INPUTS = 6; 
bool digits[NUM_INPUTS] = {0}; 
int NUM_PATTERNS = pow(2, NUM_INPUTS); 

for(int q = 0; q < NUM_PATTERNS; q++) 
{ 
    for(int w = NUM_INPUTS -1 ; w > -1 ; w--) 
    { 

     if(! ((q+1) % ((int) pow(2, w))) ) 
      digits[w] = !digits[w]; 

     outf << digits[w] << " "; 
    } 

    outf << "\n"; 
} 

不幸的是,這是一個有點扭曲,因爲它給我的第一個模式是000001,而不是000000

這不是作業。我只是編寫一個簡單的算法來給我一個用於訓練神經網絡的輸入文件。

+0

這是功課?如果是這樣,請將其標記爲 – Shahbaz 2012-04-04 15:01:14

+0

我認爲您想要進行一些鹼基轉換。 Google ** C++ base 2 ** – Blender 2012-04-04 15:01:42

+0

二進制數據與bools數組不一樣...你是否應該創建自己的二進制數字表示? – Kiril 2012-04-04 15:02:09

回答

4

不要使用pow。只需使用二進制數學:

const int NUM_INPUTS = 6; 
int NUM_PATTERNS = 1 << NUM_INPUTS; 

for(int q = 0; q < NUM_PATTERNS; q++) 
{ 
    for(int w = NUM_INPUTS -1 ; w > -1; w--) 
    { 
     outf << ((q>>w) & 1) << " "; 
    } 
    outf << "\n"; 
} 
+0

'1 << 6' = 64?我不熟悉'<<' or '>>運營商。 – 2012-04-04 18:15:52

+0

'x << n'將值'x'向左移位n位。如果你願意,它會使'x','n'次的值增加一倍。 1,二進制,是「0000_0001」。 1左移6次是「0100_0000」。在基座10,即64同樣'X >> N'通過'N'比特(或半'x','N'倍)的值'x'轉移到*右*。 http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts – 2012-04-04 18:46:40

3

注:我不提供代碼,而僅僅是一個暗示,因爲這個問題聽起來像功課

這是很容易的。看到這個例子:

number = 23 
binary representation = 10111 
first digit = (number )&1 = 1 
second digit = (number>>1)&1 = 1 
third digit = (number>>2)&1 = 1 
fourth digit = (number>>3)&1 = 1 
fifth digit = (number>>4)&1 = 1 

或者寫:

temp = number 
for i from 0 to digits_count 
    digit i = temp&1 
    temp >>= 1 

注意,通過該算法採取數字的順序是要打印的內容相反。

+0

int compare = 1L <<(digits_count - 1);數字i =(temp&compare?1:0); temp << = 1; – 2012-04-04 15:10:10

+0

如果你想知道,那會讓你按照你想要的順序取數字...... – 2012-04-04 15:29:23

+0

@OrgnlDave,我不知道,這很明顯。我只是打算給OP一個提示,讓他自己解決這個問題。 – Shahbaz 2012-04-04 15:30:51

-1

我猜,在這種情況下,問題等同於將小數轉換爲二進制。作爲解決方案,基礎算術方法也可能被應用。看起來你 開始實施該方法。

但是這種方法不能用mod(%)操作來實現。必須使用分部(/) 操作。

因此,代碼將如下所示:

int s = q; 

    for(int w = NUM_INPUTS -1 ; w > -1 ; w--) 
    { 
     (s/pow(2,w)) ? digits[w] = 1 : digits[w] = 0; 
     s %= pow(2,w); 

     outf << digits[w] << " "; 
    } 
+0

我可以問downvote的原因嗎? – oak 2012-04-04 16:22:47

+0

過度使用不必要的算術。一個循環與幾個位的移位和比較是更容易,更合適,更清晰 – 2012-04-04 16:23:46

+0

我同意其他方法的方便。但我想要解決這個問題,而不會干擾低級別的按位操作。此外,問題的方式試圖實現這種算術方法。 – oak 2012-04-04 16:30:48

1

懶惰的方式是使用std :: bitset。

例子:

#include <bitset> 
#include <iostream> 

int main() 
{ 
    for (unsigned int i = 0; i != 8; ++i){ 
    std::bitset<3> b(i); 
    std::cout << b << std::endl; 
    } 
} 

如果你想輸出的比特獨立,空間分隔,具有類似Write(b)一個調用替換std::cout << b << std::endl;,與Write定義爲:

template<std::size_t S> 
void Write(const std::bitset<S>& B) 
{ 
    for (int i = S - 1; i >= 0; --i){ 
    std::cout << std::noboolalpha << B[i] << " "; 
    } 
    std::cout << std::endl; 
} 
+0

什麼是std :: bitset? – 2012-04-04 18:54:50

+0

@MattMunson:現在我可以通過真實屏幕和真正的鍵盤訪問真正的電腦了,我添加了一個例子。 – 2012-04-04 23:04:44

相關問題