Boolfuck语言

BF系列语言   https://blog.csdn.net/nameofcsdn/article/details/110749446

Brainfuck语言一般是以8比特的字节作为单位的,如果以比特作为单位,就变成了Boolfuck语言。

目录

一,指令

二,Boolfuck和Brainfuck的区别

三,Boolfuck解释器

四,打印Hello World!


一,指令

因为每一位只能是0或1,所以就没必要区分加减了,把减去掉,就变成了7个指令:

(把,变成了.把.变成了;但是逻辑完全一样)

字符

含义

>

指针加一

<

指针减一

+

指针指向的字节的值加一

.

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

;

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

[

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

]

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

 

二,Boolfuck和Brainfuck的区别

https://esolangs.org/wiki/Boolfuck

  • Works with bits not bytes. Each cell is 1-bit and wrapping, so - is removed.
  • The output character is ; not .
  • The input is read in little endian mode and reads a single bit at a time.
  • Output is stored to a stream, then outputted in little endian mode

这里的小端,显然说的是8位如何表示一个字节的顺序,而不是4个字节如何表示一个int的顺序。

 

三,Boolfuck解释器

因为Boolfuck和Brainfuck的语法非常接近,所以用 Brainfuck的解释器 改一改就得到了Boolfuck的解释器:

string code = " ...put code here... ";
char arr[1000] = { 0 };
char* p = arr;
int pbit = 0;

void out(int a)
{
    static int bit = 0;
    static int s = 0;
    a = int(a != 0);
    s += (a << bit), bit++;
    if (bit == 8) {
        cout << char(s);
        bit = 0, s = 0;
    }
}

void run(string s)
{
    int pcode = 0;
    int b;
    while (pcode < s.length())
    {
        switch (s[pcode])
        {
        case '>':
            pbit++;
            if (pbit == 8)pbit = 0, p++;
            break;
        case '<':
            if (pbit == 0)pbit = 8, p--;
            pbit--;
            break;
        case '+':
            *p ^= (1 << pbit);
            break;
        case '.':
            cin >> b;
            *p -= ((*p >> pbit) & 1) << pbit;
            *p += (b & 1) << pbit;
            break;
        case ';':
            out(*p & (1 << pbit));
            break;
        case '[':
        {
            int num = 1, pend = pcode;
            while (num)
            {
                pend++;
                if (s[pend] == '[')num++;
                if (s[pend] == ']')num--;
            }
            string ss = s.substr(pcode + 1, pend - pcode - 1);
            while (*p)run(ss);
            pcode = pend;
            break;
        }
        case ']':
            break;
        }
        pcode++;
    }

}

int main()
{
    run(code);
    return 0;
}

 

四,打印Hello World!

Ascii码分别是72,101,108,108,111,32,87,111,114,108,100,33

二进制就是01001000,01100101,01101100,01101100,01101111,00100000,01010111,01101111,01110010,01101100,01100100,00100001

所以要打印的序列是000100101010011000110110001101101111011000000100111010101111011001001110001101100010011010000100

换成差分序列就是000110111111010100101101001011011000110100000110100111111000110101101001001011010011010111000110

所以代码是

;;;+;+;;+;+;+;+;+;+;;+;;+;;;+;;+;+;;+;;;+;;+;+;;+;+;;;;+;+;;+;;;;;;+;+;;+;;;+;+;+;+;+;+;;;;+;+;;+;;+;+;;+;;;+;;;+;;+;+;;+;;;+;+;;+;;+;+;+;;;;+;+;;

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值