0

次のような 1 と 0 の int 配列があります。

01101000
01100101
01101100
01101100
01101111

これは「hello」のビット変換です。次のような文字配列に変換したい-

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

同じのC++コードスニペットを教えてもらえますか?

4

3 に答える 3

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
于 2013-01-26T04:37:56.577 に答える
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);
}
于 2013-01-26T04:44:15.717 に答える