BF系列语言   ​​javascript:void(0)​

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

目录

​一,指令​

​二,Boolfuck和Brainfuck的区别​

​三,Boolfuck解释器​

​四,打印Hello World!​


一,指令

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

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


字符



含义



>



指针加一



<



指针减一



+



指针指向的字节的值加一



.



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



;



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



[



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



]



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



二,Boolfuck和Brainfuck的区别

https://esolangs.org/wiki/Boolfuck">​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

所以代码是

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

运行结果:

Boolfuck语言_ascii码