C ++:原始字符的1和0的整数数组

时间:2013-01-26 04:03:53

标签: c++

我有1和0的int数组,如 -

01101000
01100101
01101100
01101100
01101111

这是“你好”的位转换。 我想将它转换回字符数组,如 -

01101000 -> h
01100101 -> e
01101100 -> l
01101100 -> l
01101111 -> o

你们可以为它们提供C ++代码片段吗?

3 个答案:

答案 0 :(得分:5)

您可以定义一个类似的函数:

char bitsToChar(const char *bits)
{
    char result = 0;
    for (int i = 0; i < 8; i++)
    {
        result = (result << 1) | bits[i];
    }
    return result;
}

在每个循环中,下一位附加到存储结果的右侧,“将”先前添加的位“推”到左侧。

所以这段代码:

#include <iostream>
using namespace std;

char bits[5][8] = {
    {0,1,1,0,1,0,0,0},
    {0,1,1,0,0,1,0,1},
    {0,1,1,0,1,1,0,0},
    {0,1,1,0,1,1,0,0},
    {0,1,1,0,1,1,1,1} };

char bitsToChar(const char *bits)
{
    char result = 0;
    for (int i = 0; i < 8; i++)
    {
        result = (result << 1) | bits[i];
    }
    return result;
}

int main(const char* argv[], const int argc)
{
    for (int j = 0; j < 5; j++)
    {
        for (int i = 0; i < 8; i++)
        {
            cout << (int)bits[j][i];
        }
        cout << " -> " << bitsToChar(bits[j]) << endl;
    }
}

产生以下输出:

01101000 -> h
01100101 -> e
01101100 -> l
01101100 -> l
01101111 -> o

答案 1 :(得分:2)

数组中的每个int应根据其在数组中的位置进行左移(例如,最右边的int的值左移0,最左边的左移7)然后添加到跟踪总和的变量。遍历数组并保持位移值的总和。

假设你总是要使用8 ints的数组:

int bits[8] = {0,1,1,0,1,0,0,0};
char c = 0;
for (int i=0; i<8; i++) {
    c += bits[i]<<(7-i);
}

答案 2 :(得分:0)

我会给你一个线索,因为这似乎是家庭作业。

您可以通过在数组中有条件地添加来使二进制文件中的int。可以将int强制转换为char以返回一封信。

E.g。在基地3:

10212 : h
21121 : e 
. 
.
.

const int length_of_word = 5;
const int length_of_letter = 5;

char* word = new char[length_of_word];
for (int letter = 0; letter < length_of_word; letter ++)
{
  int accumulator = 0;
  for (int trinaryIndex = 0; trinaryIndex < length_of_letter; trinaryIndex ++)
  {
    int curVal = 1;
    if (trinaryArray[letter][trinaryIndex] > 0)
    {
      accumulator += curVal * trinaryArray[letter][trinaryIndex];
    }
    curVal *= 3;
  }
  word[letter] = (char)accumulator;
}

编辑:这不考虑MSB或LSB排序。您可能需要更改内部循环的顺序以解决该问题;)。