BF系列语言 javascript:void(0)
Brainfuck语言一般是以8比特的字节作为单位的,如果以比特作为单位,就变成了Boolfuck语言。
目录
一,指令
一,指令
因为每一位只能是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
所以代码是
;;;+;+;;+;+;+;+;+;+;;+;;+;;;+;;+;+;;+;;;+;;+;+;;+;+;;;;+;+;;+;;;;;;+;+;;+;;;+;+;+;+;+;+;;;;+;+;;+;;+;+;;+;;;+;;;+;;+;+;;+;;;+;+;;+;;+;+;+;;;;+;+;;
运行结果: