吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1728|回复: 3
收起左侧

[其他转载] [BrainFuck] 使用BrainFuck进行逻辑运算

[复制链接]
VioletTec 发表于 2021-4-1 22:45
本帖最后由 VioletTec 于 2021-4-4 14:09 编辑

使用BrainFuck进行逻辑运算

由于我之前写过一个《如何使用BrainF**k实现整数除法计算?》。最近想要升级一下除法,可以支持取余操作(由于整数的除法因为代码太长,当时没有加注释,草稿纸早就丢了,猛的一看也把我自己给看呆了.....根本看不懂,抽空在想回思整数除法的细节后再说除法取余算法吧...),在设计的过程中,发现需要用到逻辑运算,于是简单研究了一下,整理出来。

本文首发博客文章地址:https://blog.mcplugin.cn/p/775


数字类型转换为布尔类型的实质:若数字不为0,则返回值为1,反之为0

起始指针、参数、返回值、最终指针与运算损耗:
  • 起始指针:

    • i0
  • 参数:

    • i0:存放第一个运算参数(i0 ∈ Z*)
  • 返回值:

    • i1:存放数字i0转换为布尔类型后的值(i1∈{0,1})
  • 运算损耗位:

    • i0、i1
  • 最终指针:

    • i1
思路:

若i0不为0,清空i0,转移到i1,递增1。反之直接输出i1(i1=0)。

代码:
 [[-]>+<]>

或运算

或运算的本质:参与运算的两个数据有任意一个为1,则输出结果为1。

起始指针、参数、返回值、最终指针与运算损耗:
  • 起始指针:

    • i0
  • 参数:

    • i0:存放第一个运算参数(i0∈{0,1})
    • i1:存放第二个运算参数(i1∈{0,1})
  • 返回值:

    • i1:存放i0与i1或运算后的结果(i1∈{0,1})
  • 运算损耗位:

    • i0、i1
  • 最终指针:

    • i1
思路:

或运算只有四种情况:

i0 = 0 , i1 = 1i0 = 1 , i1 = 0i0 = 0 , i1 = 0i0 = 1 , i1 = 1

如果i0为1,则清空i1后,将i1置为1

如果i0为0,则直接输出i1

代码:
[->[-]+<]>

与运算

与运算的本质:只有参与运算的两个数字同时为1,输出的结果才能是1。与运算的本质:只有参与运算的两个数字同时为1,输出的结果才能是1。

起始指针、参数、返回值、最终指针与运算损耗:
  • 起始指针:
    • i0
  • 参数:
    • i0:存放第一个运算参数(i0∈{0,1})
    • i1:存放第二个运算参数(i1∈{0,1})
  • 返回值:
    • i2:存放i0与i1与运算后的结果(i0∈{0,1})
  • 运算损耗位:
    • i0、i1、i2
  • 最终指针:
    • i2
思路:

在写BF实现带余数的除法过程中,发现了我写的与运算有问题,现已改正,直接CV别人的代码,等有空再研究,现在在忙着搞除法运算。

该算法原创博客地址:https://blog.csdn.net/nameofcsdn/article/details/110350025

代码:
[[->[->[-]+<]<]]>[-]>

非运算

与运算的本质:输入的一个参数中,取反即可。

起始指针、参数、返回值、最终指针与运算损耗:
  • 起始指针:

    • i0
  • 参数:

    • i0:存放第一个运算参数(i0∈{0,1})
  • 返回值:

    • i1:存放i0非运算后的结果(i1∈{0,1})
  • 运算损耗位:

    • i0、i1
  • 最终指针:

    • i1
思路:

既然要取反,可以在i1的位置标记为1

若i0为0,则不操作 ,直接移动到i1的位置返回

若i0为1,则进入循环,清空i0后,移动到i1,清空i1

代码:
>+<[->-<]>

异或运算

异或运算的本质:输入的两个参数,只有他们两个相等返回值为1,反之为0

起始指针、参数、返回值、最终指针与运算损耗:
  • 起始指针:

    • i0
  • 参数:

    • i0:存放第一个运算参数(i0∈{0,1})
    • i1:存放第二个运算参数(i1∈{0,1})
  • 返回值:

    • i2:存放i0与i1异或算后的结果(i2∈{0,1})
  • 运算损耗位:

    • i0、i1、i2
  • 最终指针:

    • i2
思路:

首先在i2的位置上+1,作为标记

仍为四种情况:

  • i0 == 1 且 i1 == 1 :
    i1 == 1时会进入[>+<]判断,将i2的标志位+1,此时i2为2,作为i1 == 1 的记录,最终>-<<]对i2进行-1

    • 最终得到 i2 == 1。
  • i0 == 1 且 i1 == 0 :
    i1 == 0 时不会进入[>+<]判断,>-<<]无论怎么样,若i0 == 1,i2最终都要 -1

    • 最终得到 i2 == 0。
  • i0 == 0 且 i1 == 0 :
    由于i0 == 0,所以前面的判断根本不会走,直接会跳到>[->-<]>,此时若i1 == 0,就直接输出一开始设置的i2 == 1

    • 最终得到 i2 == 1
  • i0 == 0 且 i1 == 1:
    由于i0 == 0,所以前面的判断根本不会走,(所以此时i2 == 1,i0、i1仍为传进的参数)直接会跳到>[->-<]>,此时若i1 == 1,会进入[->-<],对i2进行-1

    • 最终得到 i2 == 0。
代码:
>>+<<[->[>+<]>-<<]>[->-<]>

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wildfire_810 发表于 2021-4-2 07:02
这个语言实在是太麻烦了。只有烧脑用途
yuleniwo 发表于 2021-4-2 08:35
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表