2017-04-22 87 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; 
}