我不能,因为爱自己弄清楚这个C代码背后的逻辑。
据推测,以下内容应该打印出unsigned char x的二进制表示,我们只允许填空。
void print_binary(unsigned char x) {
int b = 128;
while (__________________) {
if (b <= x) {
x -= b;
printf("1");
} else
printf("0");
______________________;
}
}
当然,我可以通过忽略上面的线来游戏程序。但是我的印象是,这不是真正做事的方式(更多的是黑客攻击)。
我的意思是现在,第一个条件检查128是否是&lt; = char,但是不是unsigned char,是什么,255个字节?那么为什么它只打印'1'。
也许我错过了一些非常明显的东西(不是真正的程序员),但这次逻辑并没有沉入我的内心。
有人能指出我正确的方向吗?如果你能在没有完全说出答案的情况下给我一个线索,那将是天堂般的。
答案 0 :(得分:3)
void print_binary(unsigned char x) {
int b = 128;
while (b != 0) {
if (b <= x) {
x -= b;
printf("1");
} else
printf("0");
b = b >> 1;
}
}
b的二进制表示是10000000
。通过执行b >> 1
并检查b <= x
,我们可以检查x
上的每个位是1
还是0
。
答案 1 :(得分:1)
你只想知道:当前位的值总是大于它之后的较低有效位的组合。因此,代码尝试在每次循环迭代时仅测试最重要的“1”位。
答案 2 :(得分:0)
如果我们忽略原始代码,最直观的方法是:
void print_binary (uint8_t x)
{
for(uint8_t mask=0x80; mask!=0; mask>>=1)
{
if(x & mask)
{
printf("1");
}
else
{
printf("0");
}
}
printf("\n");
}