文字をバイナリ表現に変換しようとしています(文字->アスキーhex->バイナリ)。
私はシフトする必要があることを知っており、AND
。しかし、私のコードは何らかの理由で機能していません。
これが私が持っているものです。 *temp
は、C文字列のインデックスを指します。
char c;
int j;
for (j = i-1; j >= ptrPos; j--) {
char x = *temp;
c = (x >> i) & 1;
printf("%d\n", c);
temp--;
}
SINGLE文字をバイナリに出力する2つの関数を示します。
void printbinchar(char character)
{
char output[9];
itoa(character, output, 2);
printf("%s\n", output);
}
printbinchar(10)はコンソールに書き込みます
1010
itoaは、単一の整数値を指定されたベースの文字列に変換するライブラリ関数です。たとえば... itoa(1341、output、10)は、出力文字列 "1341"に書き込みます。そしてもちろんitoa(9、output、2)は出力文字列 "1001"に書き込みます。
次の関数は、標準出力に文字の完全なバイナリ表現を出力します。つまり、上位ビットがゼロの場合も、8ビットすべてを出力します。
void printbincharpad(char c)
{
for (int i = 7; i >= 0; --i)
{
putchar( (c & (1 << i)) ? '1' : '0' );
}
putchar('\n');
}
printbincharpad(10)はコンソールに書き込みます
00001010
次に、文字列全体(最後のnull文字なし)を出力する関数を示します。
void printstringasbinary(char* s)
{
// A small 9 characters buffer we use to perform the conversion
char output[9];
// Until the first character pointed by s is not a null character
// that indicates end of string...
while (*s)
{
// Convert the first character of the string to binary using itoa.
// Characters in c are just 8 bit integers, at least, in noawdays computers.
itoa(*s, output, 2);
// print out our string and let's write a new line.
puts(output);
// we advance our string by one character,
// If our original string was "ABC" now we are pointing at "BC".
++s;
}
}
ただし、itoaはパディングゼロを追加しないため、printstringasbinary( "AB1")は次のように出力されます。
1000001
1000010
110001
あなたのコードは非常に曖昧で理解できませんが、代替手段を提供できます。
まず、temp
で文字列全体を調べたい場合は、次のようにします。
_char *temp;
for (temp = your_string; *temp; ++temp)
/* do something with *temp */
_
for
条件としての_*temp
_という用語は、単に文字列の終わりに達したかどうかを確認するだけです。ある場合、_*temp
_は_'\0'
_(NUL
)になり、for
は終了します。
次に、for内で、_*temp
_を構成するビットを検索します。ビットを出力するとしましょう:
_for (as above)
{
int bit_index;
for (bit_index = 7; bit_index >= 0; --bit_index)
{
int bit = *temp >> bit_index & 1;
printf("%d", bit);
}
printf("\n");
}
_
それを少し一般的にする、つまり任意の型をビットに変換するには、_bit_index = 7
_をbit_index = sizeof(*temp)*8-1
に変更します。
unsigned char c;
for( int i = 7; i >= 0; i-- ) {
printf( "%d", ( c >> i ) & 1 ? 1 : 0 );
}
printf("\n");
説明:
すべての反復で、1と比較して、ビットとバイナリをシフトすることにより、バイトから最上位ビットが読み取られます。
たとえば、入力値が128であると仮定します。バイナリは1000 0000に変換されます。これを7だけシフトすると0000 0001となるため、最上位ビットは1であったと結論付けます。00000001&1 =1。これが最初のビットです。コンソールに印刷します。次の反復は0 ... 0になります。