IOCCC大赛代码分析笔记

源代码如下:

main(_){_^448&&main(-~_);putchar(--_%64?32|-~7[__TIME__-_/8%8][">'txiZ^(~z?"-48]>>";;;====~$::199"[_*2&8|_/64]/(_&2?1:8)%8&1:10);}

结果是用!号显示当前的时间。

为了理解代码,首先整理下:

  1. 规范主函数,加入头文件,并用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;
}
  1. 其中~ 按位取反,对于有符号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;
}
  1. 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;
}
  1. 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;
}
  1. 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;
}
  1. []的优先级最高,同时注意到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大赛代码分析笔记相关推荐

  1. react-native-quan代码分析笔记

    react-native-quan代码分析笔记 react-native-quan是一个基于react-native的android app,没有做 ios 导出,一个简单的新闻列表展示. 程序版本: ...

  2. tensorflow笔记:多层CNN代码分析

    tensorflow笔记系列:  (一) tensorflow笔记:流程,概念和简单代码注释  (二) tensorflow笔记:多层CNN代码分析  (三) tensorflow笔记:多层LSTM代 ...

  3. tensorflow笔记:多层LSTM代码分析

    tensorflow笔记系列:  (一) tensorflow笔记:流程,概念和简单代码注释  (二) tensorflow笔记:多层CNN代码分析  (三) tensorflow笔记:多层LSTM代 ...

  4. 机器学习笔记——支持向量机SMO算法完整版代码分析

    机器学习笔记--支持向量机SMO算法完整版代码分析 代码大体分析 外循环 参数类 内循环 KKT条件判断 eCache参数 完整SMO代码 添加核函数代码 代码参考书籍:<机器学习实战> ...

  5. PCIe学习笔记之MSI/MSI-x中断及代码分析

    本文基于linux 5.7.0, 平台是arm64 1. MSI/MSI-X概述 PCIe有三种中断,分别为INTx中断,MSI中断,MSI-X中断,其中INTx是可选的,MSI/MSI-X是必须实现 ...

  6. linux内核笔记之SMMU代码分析

    2020/06/10: first version, 主要介绍smmu驱动的初始化流程 在前一篇博文ARM SMMU学习笔记中, 介绍了SMMU的一些基本概念以及SMMU地址转换的基本流程,本文主要分 ...

  7. 初学Verilog语言基础笔记整理(实例点灯代码分析)持续更新~

    实例:点灯学习 一.Verilog语法学习 1. 参考文章 刚接触Verilog,作为一个硬件小白,只能尝试着去理解,文章未完-持续更新. 参考博客文章: Verilog语言入门学习(1) Veril ...

  8. 学习笔记-第一章 恶意代码分析实战

    第一章 从可执行文件提取有用信息的多种方法,包括以下技术:1.使用反病毒软件来确认程序样本的恶意性:2.使用哈希来识别恶意代码:3.从文件的字符串列表,函数和文件头信息中发掘有用信息.字符串包括 AS ...

  9. 学习笔记-第十四章 恶意代码分析实战

    第十四章 恶意代码的网络特征 1.网络应对措施. 网络行为的基本属性包括IP地址,TCP端口,以及流量内容等,网络和安全 设备可以利用它们,来提供网络应对措施.根据IP地址和端口,防火墙和路由器可以限 ...

  10. 国际c语言混乱编码大赛,国际C语言混乱代码大赛代码赏析(一)【转】

    国际C语言混乱代码大赛代码赏析(一) 近段时间在看<C专家编程>,里面提到国际C语言混乱代码大赛(The International Obfuscated C Code Contest I ...

最新文章

  1. 【观点】程序员应知——循序渐进
  2. 微软必应从.NET Core 2.1获得了性能提升
  3. android toast通知关闭,屏蔽系统通知,Toast无法显示的解决方案 v2.0.0
  4. 【arduino】nodemcu(ESP8266)发送邮件库测试笔记,SMTP email
  5. Flex4与WebService通信
  6. 发送json给服务器
  7. java加密文件夹_使用java.util.zip压缩文件夹,支持加密,增加描述
  8. rsync 配置详解
  9. 对象变为指定格式的数组
  10. 企业数据安全防护不可忽视,数据丢失/损坏如何处理?
  11. 历年计算机二级考试Java真题 JAVA笔试试题及答案(部分套题)
  12. csf安装及命令参数
  13. Android无线调试设备WIFI安装apk
  14. 简述计算机的含义是什么,输入法全拼和双拼是什么意思?有什么区别?
  15. 省钱兄霸王餐源码uniapp前端
  16. 边缘服务网格 osm-edge
  17. 装了oracle 开机卡黑屏,开机黑屏进不了系统,手把手教你解决电脑开机黑屏进不了系统...
  18. 搭建指标体系的底层逻辑
  19. Java程序调用MATLAB接口
  20. 分享一个门店会员管理系统模板

热门文章

  1. 零成本学arduino教程——光敏电阻传感器
  2. xboxones手柄驱动_年轻人的第一个全能型手柄——北通阿修罗3手柄体验
  3. 破解版软件-20131014更新
  4. nrf52840合成4合1烧录文件
  5. 树莓派下pyaudio安装与声音监控应用
  6. 家庭影院的Dolby音效如何设置
  7. 烽火携手中航信斩获“十佳上云”优秀案例大奖
  8. 在vscode中使用opencv
  9. C语言实现顺序表基本操作
  10. 中国渔船数量不断下降,海洋渔船下降速度较慢「图」