该网站的长时间 READER ,我不得不问的第一个问题,因为我在这里找不到答案;也许我没有使用正确的搜索条件,或者我只是试图以一种完全模糊的方式进行搜索= /
我正在使用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
,11111
(一个已经正常工作),1
和0
(也可以正常工作),那么它的行为正如所料。如果可能的话,我想保留前导零以便于阅读,但如果不能这样做,我想我可能会失去它们。
我玩过各种各样的数据类型,字符串,uint8_t,unsigned int等等,我永远无法让它做我需要的。
非常感谢任何帮助,我希望我已经包含了足够的信息。我已经省略了剩余的代码,因为我认为它是稳定的并且按预期运行,问题是由传递给它的convertToBits
函数/数据引起的。
非常感谢!
答案 0 :(得分: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;
这应该很好用。 :)
编辑:添加了类似布尔值的转换。
答案 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;
}
答案 2 :(得分: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;
}
试试这个。
答案 3 :(得分:0)
在C
或C++
中,如果您使用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
序列的宽度可以轻松更改。