Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF。

Müller的目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,为Amiga机器编写的编译器(第二版)只有240个字节大小!

就象它的名字所暗示的,brainfuck程序很难读懂。尽管如此,brainfuck图灵机一样可以完成任何计算任务。虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。

这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。

这种语言,是一种按照“Turing complete(图灵完备)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。

字符标识

编辑 播报

下面是这八种状态的描述,其中每个状态由一个字符标识:

字符

含义

>

指针加一

<

指针减一

+

指针指向的字节的值加一

-

指针指向的字节的值减一

.

输出指针指向的单元内容(ASCⅡ码)

,

输入内容到指针指向的单元(ASCⅡ码)

[

如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处

]

如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处

(按照更节省时间的简单说法,"]"也可以说成“向后跳转到对应的"["状态”。这两解释是一样的。)

(第三种同价的说法,"["意思是"向前跳转到对应的"]"",]意思是"向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。")

Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptr是char*类型):

Brainfuck

C

>

++ptr;

<

--ptr;

+

++*ptr;

-

--*ptr;

.

putchar(*ptr);

,

*ptr =getch();

[

while (*ptr) {

]

}

当前位置清零

[-] 将当前指针的值归零

之前位置清零

[[-]<] 将当前指针以及之前的指针归零

字符I/O

,. 从键盘读取一个字符并输出到屏幕上。

简单的循环

,[.,] 这是一个连续从键盘读取字符并回显到屏幕上的循环。注意,这里假定0表示输入结束,事实上有些系统并非如此。以-1和"未改变"作为判断依据的程序代码分别是",+[-.,+]"和",[.[-],]"。

指针维护

>,[.>,] 通过移动指针保存所有的输入,供后面的程序使用。

加法

[->+<]

把当前位置的值加到后面的单元中(破坏性的加,它导致左边的单元被归零)。

条件指令

编辑 播报

,----------[----------------------.,----------]

这个程序会把从键盘读来的小写字符转换成大写。按回车键退出程序。

首先,我们通过,读入第一个字符并把它减10(大多数情况下,brainfuck使用10作为换行符的值)。如果用户按的是回车键,循环命令([)就会直接跳转到程序的结尾:因为这时第一个字节已经被减到了零。如果输入的字符不是换行符(假设它是一个小写字符),程序进入循环。在这里我们再减去剩下的22,这样总共减掉32:这是ASCⅡ码中小写字符和大写字符的差值。

下面我们把它输出到屏幕。然后接收下一个输入字符,并减去10。如果它是换行符,退出循环;否则,再回到循环的开始,减去22并输出……当循环退出时,因为后面已经没有其他的指令,程序也随之终止。

加法

编辑 播报

,>++++++[<-------->-],,[<+>-],<.>.

这个程序对两个一位数做加法,并输出结果(如果结果也只有一位数的话):4+3

7 (现在程序开始有点复杂了。我们要涉及到数组中单元的内容了,比如[0]、[1]、[2]之类。)

第一个输入的数字被放在在[0]中,从中减去48来把它从ASCⅡ码值48到57转换为数值0到9:这是通过在[1]中放入6,然后按照[1]中的次数让一个循环从[0]中多次减去8来完成的(当加上或减去一个大的数值时,这是常用的办法)。下一步,加号被读入[1]中;然后,第二个数字被输入,覆盖掉加号。

下面的循环[<+>-]执行最重要的工作:通过把第二个数字移动到第一个里面让它们相加,并把[1]清空。这里的每次循环都把[0]增一并从[1]中减一;最终,在[1]被置零的多次循环中,[1]中的值就被转移到了[0]中。现在,[1]中是我们输入的换行符(这个程序里,我们没有设置对输入错误的检查机制)。

然后,指针被移回到指向[0],并输出它的内容([0]里面现在是 a + (b + 48) 的值,因为我们没有修改b的值,这等于 (a + b) + 48,也就是我们想要输出的ASCⅡ值)。然后,把指针指向[1],里面保存着前面输入的换行符;输出换行符,程序结束。

乘法

编辑 播报

,>,,>++++++++[<------<------>>-]<<[>[>+>+<<-]>>[<<+>>-]<<<-]>>>++++++[<++++++++>-],<.>.

和前一个程序类似,不过这次是乘法而不是加法。

第一个输入的数字被放入[0],星号和第二个数字被放入[1],然后两个数值都被校正:减去48。

现在,程序进入了主循环。我们的基本思想是:每次从[0]中减去一,同时把[1]的值加入到保存乘积的[2]中。在实际操作中,第一个内层循环把[1]的值同时转移到[2]和[3]中,同时[1]清零(这是我们复制数字的基该方法)。下一个内层循环把[3]中的值重新放回到[1],并清零[3]。然后从[0]中减一,结束外层循环。在退出这个循环时,[0]中为零,[1]仍然是输入的第二个数值,[2]则是这两个数值的和。(要是想保存第一个数,我们可以在外层循环中每次给[4]加一,最后把[4]移回[0]。)在结果中加48,并把换行符读入[3],输出ASCII码的乘积,然后输出刚才保存的换行符。

除法

编辑 播报

,>,>++++++[-<--------<-------->>]

从简单储存2个数字符到[0]和[1],并各自减去48

<<[ 这是一个主循环,在被除数,也就是[0]的值为0后循环跳出

>[->+>+<<] 从单元1中复制除数的值到[2]和[3],设[1]为0

>[-<<- 被除数[1]减去除数[2],结果将储存在[0],并且[2]将归0

[>]>>>[<[>>>-<<<[-]]>>]<<] 如果被除数[0]为0,跳出循环

>>>+ 加1值商到[5]

<<[-<<+>>] 从[3]复制除数到[1]

<<<] 移动指针到[0]

>[-]>>>>[-<<<<<+>>>>>] 从[5]复制商到[0] (这步不是必须的,但会更清楚)

<<<<++++++[-<++++++++>]<.

brainfuck解码工具相关推荐

  1. 小工具发布(2008-01-25更新,HTML、URL编解码工具)

    (2008-01-25)HTML.URL编解码工具 [介绍文章][访问该工具]

  2. 关于战略解码工具和方法的澄清(战略解码、OGSM、BEM模型、战略地图与平衡计分卡、OKR)

    管理概念和工具术语真的是纷繁复杂,令人眼花缭乱和思路错乱,总有对付诸实践带来失控风险的担忧.例如,对华为而言,战略管理方法诸多叫法,如华为业务领先模型BLM.华为业务执行力模型BEM.华为战略管理流程 ...

  3. Java(35):Java Base64编码和解码工具类

    Java Base64编码和解码工具类 Base64Util工具类: package com.ciphergateway.utils; import java.io.UnsupportedEncodi ...

  4. 5G RRC消息解码 工具

    5G RRC消息解码 工具持续更新,最新的解码工具可以从我的GitHub地址中获取: https://github.com/Dybinx/MessageParser_5G/

  5. [C/C++/Qt] 网易云音乐缓存文件批量自动解析解码工具 - CloudMusicCache2Mp3(开源)(Version:1.0)

    声明:本工具仅供学习研究交流使用,禁止用于非法用途.请尊重音乐创作者的劳动成果,购买正版音乐! 程序名称:网易云音乐缓存文件全自动解码工具 - CloudMusicCache2Mp3(Version: ...

  6. URL编码解码工具类

    /****************************************************************************** * CREATETIME : 2016年 ...

  7. FFMPEG之 Ubuntu系统上配置MP3和AMR编解码工具

    项目中使用的后台服务器需要支持MP3格式和AMR格式相互转换,于是想到了FFMPEG这个万能解码工具,根据以前使用FFMPEG的经验,和网上查阅相差资料,为后台同事初步实现FFMPEG命令行工具进行M ...

  8. Ciphey人工智能解密解码工具部署和使用

    目录 1.Ciphey工具介绍 2.Ciphey安装 3.Ciphey选项参数详解 4.使用实例 1.Ciphey工具介绍 Ciphey是一款基于python编写的自然语言和人工智能解密/解码工具.一 ...

  9. 隐写文件的识别和解码工具——中国的Stegohunt——隐译

    一.什么是隐写术? 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容. 二.隐写术的使用 通常可以隐写的内容是很广泛的, 可以是音 ...

最新文章

  1. leetcode 941. 有效的山脉数组
  2. React 组件性能优化之 PureComponent 的使用
  3. ios html gif 显示,iOS gif图显示问题
  4. mysql raiserror_SQL Server自定义异常的使用raiserror
  5. vs2015中安装EntityFramework
  6. Vue iview时间组件DatePicker,设置开始时间和结束时间约束
  7. iOS WKWebView 设置默认系统字体
  8. CSDN 写作小技巧(2)—— 如何在 CSDN 博客的文章开篇创建目录?
  9. matlab 图像处理之边缘提取
  10. 12306抢票,极限并发带来的思考?
  11. 应用案例 | 2011款保时捷卡宴3.0T车发动机怠速间歇性抖动故障诊断
  12. 今年最后一月数据库排名公布!前三难以撼动!
  13. 什么东西改善睡眠质量,辅助睡眠好物推荐
  14. 这些两轮电动车的黑科技你知道吗?
  15. [答疑]类图:支付手段和优惠券、金额、积分有关
  16. html 复选框 不能编辑,javascript-jqGrid-复选框编辑无法编辑所选行
  17. 服务器装CentOs7系统
  18. template文件夹可以删_请问templates是什么 文件 能删除吗?
  19. 科目三考试项目分类评判标准
  20. c语言程序教师节祝福,2015年教师节祝福语(大学生适用)

热门文章

  1. 配置Flash CS5.5 支持Air SDK 14.0
  2. 从零搭建Maven私有仓库
  3. 神经网络建模的基本思想,人工神经网络建模过程
  4. three.js流动道路
  5. windows 下 pycuda 安装问题
  6. 光环:业务敏捷流程及案例——张莉
  7. linux tc限制速度,linux tc 限速 控制流量
  8. Python之append和extent的区别
  9. 生活中有哪些实用的心理学知识?
  10. 7-211 正常血压