#CF2052B. 比特比特跳转

比特比特跳转

比特比特跳转(BitBitJump)

时间限制:3 秒 内存限制:1024 兆字节

比特比特跳转(BitBitJump)是一种单指令集计算机,它仅有一条指令:bbj a,b,c\text{bbj } a, b, c,该指令的功能是:将内存中第 aa 位复制到内存中第 bb 位,然后跳转到地址 cc

我们考虑一台 16 位 的 BitBitJump 计算机:

  • 它拥有 2162^{16} 位内存,组织为 2122^{12} 个 16 位的字;
  • 字的编号从 00 开始计数,一个字中的位从最低有效位(第 00 位)到最高有效位(第 1515 位)计数。

该计算机有一个指令指针寄存器(IP),程序执行从 IP=0\text{IP}=0 开始。

  • 若当前 IP2122\text{IP} \ge 2^{12}-2,计算机停止运行;
  • 否则,计算机以IP\text{IP} 个字作为 aaIP+1\text{IP}+1 个字作为 bbIP+2\text{IP}+2 个字作为 cc,执行 bbj a,b,c\text{bbj } a, b, c 指令。

指令执行规则

执行 bbj a,b,c\text{bbj } a, b, c 时:

  1. 复制操作:将(a4)(a \gg 4) 个字的第 (a&15)(a \mathbin{\&} 15) 位,复制到(b4)(b \gg 4) 个字的第 (b&15)(b \mathbin{\&} 15) 位; 其中,&\mathbin{\&} 表示按位与运算,\gg 表示按位右移运算。
  2. 跳转操作:将 IP\text{IP} 赋值为 cc; 注意:cc 的值是位复制完成后从内存中读取的,若指令修改了自身的 cc,则会使用新值作为 IP\text{IP}

示例

放置在内存起始位置的指令 bbj 32,35,5\text{bbj } 32, 35, 5 执行流程:

  1. 从内存中读取 a=32a=32b=35b=35
  2. 将第 22 个字的第 00 位(值为 5&1=15\mathbin{\&}1=1)复制到同一个字的第 33 位,因此第 22 个字的值变为 5+23=135+2^3=13
  3. 从内存中读取 c=13c=13,将 IP\text{IP} 设置为 1313

定义

我们将21212^{12}-1 个字(对应内存的第 216162^{16}-16 位 至 第 21612^{16}-1 位)称为IO 字

xx 比较器

xx 比较器是一段程序,用于检查 IO 字的值是否等于 xx,需满足以下要求:

  1. 执行指令数不超过 2122^{12}后停止;
  2. 若 IO 字的原始值等于 xx,程序停止后,IO 字的**最低位(第 0 位)**为 11;否则为 00

任务

编写程序,为给定的 xx 生成对应的 xx 比较器。


输入

输入一个十进制整数 xx0x<2160 \le x < 2^{16}),即需要构建比较器的目标值。

输出

输出 xx 比较器的程序内存转储:

  1. 转储内容为内存nn 个字的值(1n21211 \le n \le 2^{12}-1);
  2. 除 IO 字外,其余未输出的内存字均填充为 00
  3. 每个字输出为4 位十六进制数,数值之间用空格或换行分隔。

样例

标准输入

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

样例说明

样例输出的内存转储是一个 0 比较器,包含以下模块:

  1. 16 条指令:第 ii 条(从 0 计数)将输入字的第 ii 位复制到自身 cc 的第 6 位;若复制的位为 0,跳转到下一条指令;否则下一条指令编号增加 64。
  2. 1 条指令:将第 0 个字的第 4 位(值为 1)复制到 IO 字的第 0 位,然后跳转到停止地址。
  3. 16 个填充 0 的无用字
  4. 16 条相同指令(从第 67 个字开始):每条都将第 0 个字的第 0 位(值为 0)复制到 IO 字的第 0 位,然后跳转到停止地址。