假设我有这个号码
int x = 65535;
这是以下的十进制表示:
ÿÿ
我知道如何从单个字符中做到这一点
#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,或十六进制的 0xffff,这意味着它的正值需要 2 个字节,即 0xff 和 0xff
f & 0xff
只保留 8 个 LSb,(0xffff & 0xff = 0xff)f >> = 8
将值向右移动 8 位,0xffff 变为 0x00ff('ff' 右侧消失了f > 0
f == 0xff
从现在开始是真的下一个循环是相同的,但f >>= 8
将 0x00ff 向右移动 => 0x0000,并且 f 为空。因此f > 0
条件错误,循环结束。
您正在寻找的是位掩码:(x >> 8) & 0xFF
对于高位字节和低位字节(x & 0xFF)
。(实际上,如果int
有 32 位,它是(x >> 24) & 0xFF
用于高位字节。但考虑到值,以及您所说的期望,您可能需要第二个字节,而不是高位字节。)
你所拥有的是一个 16 位(两个字节)的无符号数。Achar
是 8 位(一个字节)。这意味着您必须提取数字中的两个字节才能将它们作为单独的字符。
这是通过按位运算符完成的。您可以使用按位&
和按位移位>>
来完成此操作。
就像是
char buffer[9];
long value = 65535;
char *cur = buffer;
while (value > 0)
{
*cur++ = value % 0x100;
value /= 0x100;
}
*cur = 0;