IOCCC大赛代码分析笔记
IOCCC大赛代码分析笔记
源代码如下:
main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);}
结果是用!号显示当前的时间。
为了理解代码,首先整理下:
- 规范主函数,加入头文件,并用i代替参数_
#include <stdio.h>
int main(int i)
{i^448&&main(-~i);putchar(--i%64?32|-~7[__TIME__-i/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[i*2&8|i/64]/(i&2?1:8)%8&1:10);return 0;
}
- 其中~ 按位取反,对于有符号int,
~i+1+i=0
,因此-~i=i+1
。并且&&
运算符是短路求值,当左值为真的时候,才会对右值求值,进入递归。改写之后,写成
#include <stdio.h>
int main(int i)
{if(i^448)main(i+1);putchar(--i%64?32|-~7[__TIME__-i/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[i*2&8|i/64]/(i&2?1:8)%8&1:10);return 0;
}
i^448
等价于i!=448
中间是一个一个? :
运算符,展开之后得到
#include <stdio.h>
int main(int i)
{if(i!=448)main(i+1);i=i-1;if(i%64)putchar(32|-~7[__TIME__-i/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[i*2&8|i/64]/(i&2?1:8)%8&1);elseputchar(10);return 0;
}
- main的默认命令行输入参数是0个,将递归改写成循环,因为从0开始进入递归,当448的时候才putchar后return,所以循环从448开始,又由于有
--i
,所以,从447开始递减到0。
#include <stdio.h>
int main(int i)
{for(i=447;i>=0;--i){if(i%64)putchar(32|-~7[__TIME__-i/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[i*2&8|i/64]/(i&2?1:8)%8&1);elseputchar(10);}return 0;
}
- 10的ascii码是\n换行。
__TIME__
是一个8位的字符数组,">'txiZ^(~z?"
是一个11位的字符数组,";;;====~$::199"
是一个14位的字符数组,将三个变量拎出来得到
#include <stdio.h>
int main(int i)
{char a[9]=__TIME__;char b[12]=">'txiZ^(~z?";char c[15]=";;;====~$::199";int temp;for(i=447;i>=0;--i){temp=-~7[a-i/8%8][b-48]>>c[i*2&8|i/64]/(i&2?1:8)%8;if(i%64)putchar(32|temp&1);elseputchar('\n');}return 0;
}
- []的优先级最高,同时注意到
7[a]=a[7]
,右移运算符>>优先级在-~之下,但是在位与&和位或|之前。temp对8取余,因此temp在0到7之间。位与&在位或|之前。32|temp&1的结果如下表所示
temp | ASCII |
---|---|
0 | 33 ! |
1 | 33 ! |
2 | 35 # |
3 | 35 # |
4 | 37 % |
5 | 37 % |
6 | 39 ’ |
7 | 39 ’ |
2019年7月16日17:15:01未完待续
2019年7月16日18:33:23更新
其中7[a-i/8%8][b-48]=b[ a[7-i/8%8]-48 ]
,a[7-i/8%8]
取的是char型,48的ascii码是0,一个char型-48等于转换为int型。其中i/8%8
每64个数一次轮回,打印一个\n,显示时间结果也是7*64的矩阵。__TIME__时间显示格式表示为H1H2:M1M2:S1S2。因此
i | i/8%8 | a[7-i/8%8] |
---|---|---|
0~7 | 0 | S2 |
8~15 | 1 | S1 |
16~23 | 2 | : |
24~31 | 3 | M2 |
32~39 | 4 | M1 |
40~47 | 5 | : |
48~55 | 6 | H2 |
56~63 | 7 | H1 |
:的ASCII码是58,所以对应的b表如下
a[7-i/8%8]-48 | b[ a[7-i/8%8]-48 ] | ASCII | -~7[a-i/8%8][b-48] |
---|---|---|---|
0 | > | 62 | 63 |
1 | ’ | 96 | 97 |
2 | t | 116 | 117 |
3 | x | 120 | 120 |
4 | i | 105 | 106 |
5 | Z | 90 | 91 |
6 | ^ | 94 | 95 |
7 | ( | 40 | 41 |
8 | ~ | 126 | 127 |
9 | z | 122 | 123 |
: | ? | 63 | 64 |
看看右移后面的项c[i*2&8|i/64]/(i&2?1:8)%8
:
i | i&2 | (i&2?1:8) | i*2&8 | i*2&8|i/64 | c[i*2&8|i/64] | c[i*2&8|i/64]/(i&2?1:8)%8 |
---|---|---|---|---|---|---|
0 | false | 8 | 0 | 0 | ; 59 | 7 |
1 | fasle | 8 | 0 | 0 | ; 59 | 7 |
2 | true | 1 | 0 | 0 | ; 59 | 7 |
3 | true | 1 | 0 | 0 | ; 59 | 7 |
4 | false | 8 | 8 | 8 | $ 36 | 4 |
5 | fasle | 8 | 8 | 8 | $ 36 | 4 |
6 | true | 1 | 8 | 8 | $ 36 | 4 |
7 | true | 1 | 8 | 8 | $ 36 | 4 |
i从0~447分为7层,每层都会有变化
i 的层数 | c[i*2&8|i/64] | c[i*2&8|i/64]/(i&2?1:8)%8 |
---|---|---|
0 | ; 59 和 $ 36 | 77334444 |
1 | ; 59 和 : 58 | 77337722 |
2 | ; 59 和 : 58 | 77337722 |
3 | =61和 ‘1’ 49 | 77556611 |
4 | =61和 ‘9’ 57 | 77557711 |
5 | =61和 ‘9’ 57 | 77557711 |
6 | =61和 ‘\0’ 0 | 77550000 |
2019年7月16日20:22:34 未完待续
IOCCC大赛代码分析笔记相关推荐
- react-native-quan代码分析笔记
react-native-quan代码分析笔记 react-native-quan是一个基于react-native的android app,没有做 ios 导出,一个简单的新闻列表展示. 程序版本: ...
- tensorflow笔记:多层CNN代码分析
tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代 ...
- tensorflow笔记:多层LSTM代码分析
tensorflow笔记系列: (一) tensorflow笔记:流程,概念和简单代码注释 (二) tensorflow笔记:多层CNN代码分析 (三) tensorflow笔记:多层LSTM代 ...
- 机器学习笔记——支持向量机SMO算法完整版代码分析
机器学习笔记--支持向量机SMO算法完整版代码分析 代码大体分析 外循环 参数类 内循环 KKT条件判断 eCache参数 完整SMO代码 添加核函数代码 代码参考书籍:<机器学习实战> ...
- PCIe学习笔记之MSI/MSI-x中断及代码分析
本文基于linux 5.7.0, 平台是arm64 1. MSI/MSI-X概述 PCIe有三种中断,分别为INTx中断,MSI中断,MSI-X中断,其中INTx是可选的,MSI/MSI-X是必须实现 ...
- linux内核笔记之SMMU代码分析
2020/06/10: first version, 主要介绍smmu驱动的初始化流程 在前一篇博文ARM SMMU学习笔记中, 介绍了SMMU的一些基本概念以及SMMU地址转换的基本流程,本文主要分 ...
- 初学Verilog语言基础笔记整理(实例点灯代码分析)持续更新~
实例:点灯学习 一.Verilog语法学习 1. 参考文章 刚接触Verilog,作为一个硬件小白,只能尝试着去理解,文章未完-持续更新. 参考博客文章: Verilog语言入门学习(1) Veril ...
- 学习笔记-第一章 恶意代码分析实战
第一章 从可执行文件提取有用信息的多种方法,包括以下技术:1.使用反病毒软件来确认程序样本的恶意性:2.使用哈希来识别恶意代码:3.从文件的字符串列表,函数和文件头信息中发掘有用信息.字符串包括 AS ...
- 学习笔记-第十四章 恶意代码分析实战
第十四章 恶意代码的网络特征 1.网络应对措施. 网络行为的基本属性包括IP地址,TCP端口,以及流量内容等,网络和安全 设备可以利用它们,来提供网络应对措施.根据IP地址和端口,防火墙和路由器可以限 ...
- 国际c语言混乱编码大赛,国际C语言混乱代码大赛代码赏析(一)【转】
国际C语言混乱代码大赛代码赏析(一) 近段时间在看<C专家编程>,里面提到国际C语言混乱代码大赛(The International Obfuscated C Code Contest I ...
最新文章
- 【观点】程序员应知——循序渐进
- 微软必应从.NET Core 2.1获得了性能提升
- android toast通知关闭,屏蔽系统通知,Toast无法显示的解决方案 v2.0.0
- 【arduino】nodemcu(ESP8266)发送邮件库测试笔记,SMTP email
- Flex4与WebService通信
- 发送json给服务器
- java加密文件夹_使用java.util.zip压缩文件夹,支持加密,增加描述
- rsync 配置详解
- 对象变为指定格式的数组
- 企业数据安全防护不可忽视,数据丢失/损坏如何处理?
- 历年计算机二级考试Java真题 JAVA笔试试题及答案(部分套题)
- csf安装及命令参数
- Android无线调试设备WIFI安装apk
- 简述计算机的含义是什么,输入法全拼和双拼是什么意思?有什么区别?
- 省钱兄霸王餐源码uniapp前端
- 边缘服务网格 osm-edge
- 装了oracle 开机卡黑屏,开机黑屏进不了系统,手把手教你解决电脑开机黑屏进不了系统...
- 搭建指标体系的底层逻辑
- Java程序调用MATLAB接口
- 分享一个门店会员管理系统模板