#P16750. [Nerc2024]BitBitJump
[Nerc2024]BitBitJump
题目描述
BitBitJump 是一台单指令集计算机。因此,它只有一条指令:
bbj a, b, c
该指令将内存中的第 a 位复制到第 b 位,然后跳转到地址 c。
考虑一台 16 位的 BitBitJump 计算机。它有 位内存,被组织为 个 16 位字。字从 开始编号;一个字内的位从最低有效位(第 位)到最高有效位(第 位)编号。
这台计算机只有一个指令指针寄存器 IP,程序从 IP = 0 开始执行。
若当前
计算机停止运行。否则,它将第 IP 个字作为 ,第 IP+1 个字作为 ,第 IP+2 个字作为 ,并执行指令 bbj a, b, c:
- 将第 位,即第 个字中的对应位,复制到第 位,即第 个字中的对应位;
- 令
IP = c。
其中,& 表示按位与,>> 表示按位右移。
注意, 的值是在位复制操作完成之后才从内存中读取的。因此,如果这条指令修改了自身的 ,那么跳转时将使用修改后的新值。
例如,放在内存开头的指令
bbj 32, 35, 5
将按如下过程执行:
- 从内存中读出 、;
- 将第 个字的第 位复制到同一个字的第 位。第 个字原来的值为 ,其最低位为 ,因此修改后该字的值为 ;
- 再从内存中读取 ,并令
IP = 13。
将第 个字,也就是内存第 位到第 位组成的字,称为 IO 字。
一个 -比较器 是检查 IO 字原始值是否等于 的程序。它必须满足:
- 执行不超过 条指令后停止;
- 若 IO 字的原始值等于 ,停止时 IO 字最低位应为 ;
- 否则,停止时 IO 字最低位应为 。
请编写一个程序,为给定的 生成一个 -比较器。
输入格式
输入包含一个十进制整数 :
输出格式
输出所构造的 -比较器的程序转储。
转储由内存前 个字的值组成,其中
除这前 个字和 IO 字以外,其他所有字均视为填充为零。
对于这 个字中的每一个,输出其值对应的 恰好四位十六进制数。各数之间可以用空格或换行分隔。
样例
0
fff0 0026 0003 fff1 0056 0006 fff2 0086 0009 fff3 00b6 000c fff4 00e6 000f
fff5 0116 0012 fff6 0146 0015 fff7 0176 0018 fff8 01a6 001b fff9 01d6 001e
fffa 0206 0021 fffb 0236 0024 fffc 0266 0027 fffd 0296 002a fffe 02c6 002d
ffff 02f6 0030
0004 fff0 0fff
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff
0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff
0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff 0000 fff0 0fff
0000 fff0 0fff
样例说明
样例输出中的程序转储是一个 -比较器,它由以下几部分组成:
- 前 16 条指令:从 开始计数,第 条指令将输入字的第 位复制到自身跳转目标 的第 位。如果复制的位为 ,程序继续执行下一条指令;否则,下一条指令的编号会增加 ;
- 接下来的一条指令:将第 个字的第 位(其值为 )复制到 IO 字的第 位,并跳转到停止地址;
- 接下来的 16 个未使用字,全部填充为 ;
- 从第 67 个字开始有 16 条相同指令。每条指令都将第 个字的第 位(其值为 )复制到 IO 字的第 位,并跳转到停止地址。