P12093 [NERC2024] BitBitJump
题目描述
BitBitJump 是一种单指令集计算机,仅包含一条指令:$\texttt{bbj a, b, c}$。该指令将内存的第 $a$ 位复制到第 $b$ 位,然后跳转到地址 $c$。
我们考虑一台 16 位 BitBitJump 计算机,其内存包含 $2^{16}$ 位,组织为 $2^{12}$ 个 16 位字。字从 0 开始编号,每个字中的位从最低有效位(第 0 位)到最高有效位(第 15 位)编号。
该计算机有一个指令指针寄存器 $(\mathrm{IP})$,执行从 $\mathrm{IP}=0$ 开始。如果当前 $\mathrm{IP} \ge 2^{12}-2$,计算机停止运行。否则,它将 $\mathrm{IP}$ 指向的字作为 $a$,$(\mathrm{IP}+1)$ 指向的字作为 $b$,$(\mathrm{IP}+2)$ 指向的字作为 $c$,执行 \texttt{bbj a, b, c} 指令:将 $(a \& 15)$-th 位(即 $a$ 的低 4 位)从 $(a \gg 4)$-th 字(即 $a$ 右移 4 位后的值)复制到 $(b \& 15)$-th 位(即 $b$ 的低 4 位)的 $(b \gg 4)$-th 字,并设置 $\mathrm{IP}=c$。这里 $\&$ 表示按位与运算,$\gg$ 表示右移运算。注意 $c$ 的值是在位复制操作之后从内存中读取的,因此如果指令修改了自己的 $c$,新值将被用作 $\mathrm{IP}$。
我们称 $(2^{12}-1)$-th 字(内存的第 $2^{16}-16$ 到 $2^{16}-1$ 位)为 $\textit{IO-word}$。一个 $\textit{x-比较器}$ 是检查 IO-word 的值是否等于 $x$ 的程序。它应在执行不超过 $2^{12}$ 条指令后停止,如果 IO-word 的原始值等于 $x$,则将 IO-word 的最低位设为 1,否则设为 0。
请编写一个程序,为给定的 $x$ 值生成 $x$-比较器。
输入格式
输入包含一个十进制整数 $x$($0 \le x < 2^{16}$),表示要构建比较器的目标值。
输出格式
输出应包含 $x$-比较器的内存转储。转储包含内存前 $n$ 个字的值($1 \le n \le 2^{12}-1$),其余字(除 IO-word 外)填充为零。
每个字的值用 4 个字符的十六进制数表示,值之间用空格或换行符分隔。
说明/提示
样例输出中的内存转储包含一个 0-比较器,由以下部分组成:
1. 16 条指令:从 0 开始编号的第 $i$ 条指令将输入字的第 $i$ 位复制到自己 $c$ 的第 6 位。如果复制的位为 0,则继续执行下一条指令;否则,下一条指令的编号将增加 64。
2. 后续指令将第 0 个字的第 4 位(值为 1)复制到 IO-word 的第 0 位,并跳转到停止地址。
3. 16 个未使用的字,填充为 0。
4. 16 条相同的指令(从第 67 个字开始):每条指令将第 0 个字的第 0 位(值为 0)复制到 IO-word 的第 0 位,并跳转到停止地址。