次のような 1 と 0 の int 配列があります。
01101000
01100101
01101100
01101100
01101111
これは「hello」のビット変換です。次のような文字配列に変換したい-
01101000 -> h
01100101 -> e
01101100 -> l
01101100 -> l
01101111 -> o
同じのC++コードスニペットを教えてもらえますか?
次のような 1 と 0 の int 配列があります。
01101000
01100101
01101100
01101100
01101111
これは「hello」のビット変換です。次のような文字配列に変換したい-
01101000 -> h
01100101 -> e
01101100 -> l
01101100 -> l
01101111 -> o
同じのC++コードスニペットを教えてもらえますか?
次のような関数を定義できます。
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
配列内の各値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);
}