2017-04-22 84 views
-1

好長時間讀者的網站,第一個問題,我不得不問,因爲我無法在這裏找到答案;也許我沒有使用正確的搜索條件,或者我只是試圖以一種完全模糊的方式來做到這一點=/如何將int轉換爲位?

我正在與一個Arduino和一些LED形成一個矩陣板,並試圖獲取文本/符號來顯示它。爲了實現這一點,我已經映射了一些數字(0 & 1開始)以及需要哪些像素來形成它們(每個像素將高5個,寬3個)。我一直在試圖將這些存儲在數組中,如下所示:

int displayLetters[2][4] = { // [2] = number of chars/digits contained in array, [4] = display width (3) + 1 blank column 
    {11111,10001,11111,00000}, // 0 
    {01001,11111,00001,00000} // 1 
}; 

然後我創建了下面的(我以爲會是一個簡單的)功能對那些爲0的數組和1的必要的「爆炸」,這然後迭代以確定LED應該打開還是關閉。

void convertToBits(int inputValue, int outputArray[]) { 
    int i = 0; 

    if (inputValue == 0) { // set all values of array to zero 
    for (i = 0; i < 5; i++) { 
     outputArray[4-i] = 0; 
    } 
    } else {  
    while (inputValue > 0) { 
     int digit = inputValue % 10; 
     outputArray[4-i] = digit; // 4-i to prevent digits being stored in reverse order 

     inputValue /= 10; 
     i++; 
    } 
    } 
} 

期待,對於displayLetters[1][0]我會得到這樣{0,1,0,0,1}的數組。但是當它到達convertToBits它顯示爲513(我認爲這是HEX值?)。

如果我把這個值作爲剛剛1001,​​(即一個正常工作的話),10(也能正常工作)分別爲,那麼它的行爲預期。如果可能的話,我希望保持領先的零值,但如果不能這樣做,我想我可能會失去它們。

我已經玩過各種數據類型,字符串,uint8_t,unsigned int等,我永遠不能得到它來做我所需要的。

任何幫助非常感謝,我希望我已經包含足夠的信息。我已經省略了其他代碼,因爲我認爲要保持穩定並按預期行事,這些問題是由傳遞給它的函數/數據造成的。

非常感謝!

+1

數字與0領先的代碼被解釋爲八進制,不是小數! 01001(OCT)== 513(費爾南德斯) – tpr

+0

嗨TPR,感謝您的答覆,我認爲可能會發生,但我從來沒有牽制如何它在8個的或16的是否打算! –

+0

這是C還是C++?請不要說兩個!看起來像C. – Persixty

回答

4

如果您正在使用C++ 14,你可以在表單中使用binary literals

int displayLetters[2][4] = { 
    {0b11111,0b10001,0b11111,0b00000}, // 0 
    {0b01001,0b11111,0b00001,0b00000} // 1 
}; 

否則,您必須使用十六進制文字:

int displayLetters[2][4] = { 
    {0x1F,0x11,0x1F,0x00}, // 0 
    {0x09,0x1F,0x01,0x00} // 1 
}; 

要得到位爲這5位長值,我們使用位運算符(好玩的,是吧?):

outputArray[0] = (inputValue & 0x10) ? 1 : 0; 
outputArray[1] = (inputValue & 0x08) ? 1 : 0; 
outputArray[2] = (inputValue & 0x04) ? 1 : 0; 
outputArray[3] = (inputValue & 0x02) ? 1 : 0; 
outputArray[4] = (inputValue & 0x01) ? 1 : 0; 

// Or with binary literals: 

outputArray[0] = (inputValue & 0b10000) ? 1 : 0; 
outputArray[1] = (inputValue & 0b1000) ? 1 : 0; 
outputArray[2] = (inputValue & 0b100) ? 1 : 0; 
outputArray[3] = (inputValue & 0b10) ? 1 : 0; 
outputArray[4] = (inputValue &  0b1) ? 1 : 0; 

這應該工作nicel年。 :)

編輯:添加轉換爲布爾類似的值。

+0

嗨@InternetAussie,謝謝你的迴應。令人討厭的是,我曾想過在半夜使用位操作員,但忘記了我今天早上再次啓動並剛剛開始時,我昨晚離開了。我用Hex方法實現了你的解決方案,結果很奇怪,在轉換0x11(dec 31,bin 11111)時得到'168421'。當我意識到這只是表明16,8,4,2和1是真實的時候,我改變了以下的方法,現在它正在工作! '如果(inputValue將與0x10),以outputArray [0] = 1;'非常感謝你的幫助:) –

+0

我以爲* *有什麼東西掉了。我在考慮布爾:P不客氣:) – InternetAussie

+0

很好的編輯來創建一個獨立的響應。我在'convertToBits'函數調用之前將main()中原始數組的內容初始化爲0來對抗此問題。 –

0
vector<int> convert(int x) { 
    vector<int> ret; 
    while(x) { 
    if (x&1) 
    ret.push_back(1); 
    else 
    ret.push_back(0); 
x>>=1; 
} 
reverse(ret.begin(),ret.end()); 
return ret; 
} 

試試這個。

+0

感謝您的快速回復伊內斯 - 我竭力要看看如何實現這一點,我已經試過'INT columnState [5];'和'columnState =轉換(「01001」);'但它不會編譯,給我一些錯誤,包括以下消息:'錯誤:'矢量'不命名一個類型'。 –

+0

使用'std :: vector'編譯應該使用'-std = C++ 11'標誌完成。 – Sma

0

CC++如果用0開始一個數字,編譯器將其讀取爲octal數字。爲了避免這種情況,請在聲明displayLetters數組時保留前導零。

void convertToBits(int inputValue, int outputArray[]) 
{ 
    int i = 0, width=5; 
    int number = inputValue; 
    for (i = 0; i < 5; i++) { 
     if(inputValue>0){ 
      outputArray[4-i] = (inputValue%10); 
      inputValue/=10; 
     } 
     else 
      outputArray[4-i] = 0; 
    } 
} 

這個函數將採取的leading zeros護理和bit序列的寬度可以容易地改變。

+0

通過使用'%10'和'/ 10'你分裂這一數字爲單個十進制數字而不是位。 – Persixty

+0

@DanAllen我的代碼是這樣做太(我可以看到它高興地分割成513 {0,0,5,1,3},但我認爲它會在這樣的情況:我只處理0的,並已接受1的創造'有點'位? –

1

以下是正整數轉換爲位在C++

#include<iostream> 
using namespace std; 

void convertIntegerToBits(int number) { 
    if(number>0) { 
    convertIntegerToBits(number>>1); 
    cout<<(number&1); 
    } 
    return ; 
} 

int main() { 
    convertIntegerToBits(1024); 
    return 0; 
}