【发布时间】:2013-10-10 20:16:44
【问题描述】:
上学期我上了操作系统课。我对整个班级都是用 C 语言教授的并不感到惊讶,但它的大量使用似乎让班上的一些人感到厌烦。课程结束后,一些不喜欢这门语言的人大声疾呼,他们不必再次用 C 编程是多么高兴。这引发了学生(和老师)之间的一场小辩论,最终以一位教授该课程的老师的回复结束。他的答案是用 C 代码写的:
#include <stdio.h>
unsigned char output[] = {
0xe7, 0x3a, 0x1d, 0x2f, 0x01,
0x92, 0x42, 0x09, 0x48, 0x01,
0x92, 0x32, 0x09, 0x8e, 0x01,
0x92, 0x0a, 0x09, 0x48, 0x01,
0xe7, 0x73, 0xdd, 0x2f, 0x00,
};
int main() {
unsigned char* wb;
int i;
for (wb = output; *wb; wb++) {
if (*wb == 0x01) {
printf("\n");
continue;
}
for (i = 7; i >= 0; i--) {
putchar((((*wb >> i) & 1) + 0x20));
}
}
printf("\n");
return 0;
}
打印出来:
!!! !!! !!! ! !!! ! ! !!!!
! ! ! ! ! ! ! ! !
! ! ! !! ! ! !! !!!
! ! ! ! ! ! ! ! !
!!! !!! !!! !!!! !!! ! ! !!!!
这是我一生中见过的任何人用 C 代码做的最酷的事情!!! 谁能给我解释一下这是怎么做到的?
[编辑:为清晰起见调整了缩进]
【问题讨论】:
-
解开混淆代码是为了好玩。使用调试器并回答您自己的问题。我会赞成答案。顺便说一句,C 是一种很好的基础语言:UNIX 就是用它编写的。
-
好吧,我更多的是寻找提示而不是完整的解释。我同意,这更有趣:)
-
两条线索:0x00 是数据块中的终止条件,>> 是按位移位,但要注意运算符优先级。这真的很容易。现在把那个调试器拿出来。
标签: c printing unsigned-char