私がこの番号を持っているとしましょう
int x = 65535;
次の 10 進表現はどれですか。
ÿÿ
単一の文字からそれを行う方法を知っています
#include <stdio.h>
int main() {
int f = 65535;
printf("%c", f);
}
しかし、これは私に「ÿ」しか与えません
外部ライブラリを使用せずに、できれば C 型の文字列を使用してこれを行いたいと思います。
#include <stdio.h>
int main() {
unsigned f = 65535; // initial value
// this will do the printf and ff >>= 8 until f <= 0 ( =0 actually)
do {
printf("%c", f & 0xff); // print once char. The &0xff keeps only the bits for one byte (8 bits)
f >>= 8; // shifts f right side for 8 bits
} while (f > 0);
}
値65535、または16進数の0xffffについて考えてみます。これは、その正の値が0xffと0xffの2バイトを使用することを意味します。
f & 0xff
8LSbのみを保持します(0xffff&0xff = 0xff)f >> = 8
値を8ビット右にシフトすると、0xffffは0x00ffになります(「ff」の右側はなくなります)f > 0
f == 0xff
今から本当です次のループは同じですが、f >>= 8
0x00ffを右にシフト=> 0x0000、fはnullです。したがって、f > 0
条件が間違っており、ループが終了します。
あなたが探しているのはビットマスキングです:(x >> 8) & 0xFF
上位バイトと(x & 0xFF)
下位バイト用です。(実際には、 int
32ビットの場合は上位(x >> 24) & 0xFF
バイト用です。ただし、値と期待どおりのことを考えると、上位バイトではなく2番目のバイトが必要になる可能性があります。)
何かのようなもの
char buffer[9];
long value = 65535;
char *cur = buffer;
while (value > 0)
{
*cur++ = value % 0x100;
value /= 0x100;
}
*cur = 0;
あなたが持っているのは、16 ビット (2 バイト) の符号なしの数値です。Achar
は 8 ビット (1 バイト) です。これは、数値の 2 バイトを抽出して別の文字として取得する必要があることを意味します。
これは、ビット単位の演算子で行われます。それを達成するために、ビット単位&
およびビット単位シフトを使用できます。>>