如何将int转换为位?

时间:2017-04-22 10:53:58

标签: c

该网站的长时间 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值?)。

如果我将值仅设为100111111(一个已经正常工作),10(也可以正常工作),那么它的行为正如所料。如果可能的话,我想保留前导零以便于阅读,但如果不能这样做,我想我可能会失去它们。

我玩过各种各样的数据类型,字符串,uint8_t,unsigned int等等,我永远无法让它做我需要的。

非常感谢任何帮助,我希望我已经包含了足够的信息。我已经省略了剩余的代码,因为我认为它是稳定的并且按预期运行,问题是由传递给它的convertToBits函数/数据引起的。

非常感谢!

4 个答案:

答案 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)

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 zerosbit序列的宽度可以轻松更改。