QOJ.ac

QOJ

実行時間制限: 3.0 s メモリ制限: 1024 MB 満点: 100

#10415. 位位跳跃

統計

BitBitJump 是一台单指令集计算机。它只有一条指令:bbj a, b, c,该指令将内存中第 $a$ 位复制到内存中第 $b$ 位,然后跳转到地址 $c$。

考虑一台 16 位的 BitBitJump 计算机。它拥有 $2^{16}$ 位内存,组织为 $2^{12}$ 个 16 位字。字从 0 开始编号,字内的位从最低有效位(第 0 位)到最高有效位(第 15 位)进行编号。

该计算机拥有一个指令指针寄存器 (IP),执行从 IP = 0 开始。如果当前 IP >= 2^{12} - 2,计算机停止。否则,它使用第 IP 个字作为 $a$,第 (IP + 1) 个字作为 $b$,第 (IP + 2) 个字作为 $c$,并执行 bbj a, b, c 指令:将第 (a & 15) 个字中的第 (a >> 4) 位复制到第 (b & 15) 个字中的第 (b >> 4) 位,并将 IP 设置为 $c$。这里,& 表示按位与运算,>> 表示按位右移运算。注意,$c$ 的值是在位复制完成后从内存中读取的,因此如果指令修改了它自己的 $c$,则新的值将被用于 IP

例如,放置在内存起始处的 bbj 32, 35, 5 指令执行过程如下: 1. 从内存中读取 $a = 32$ 和 $b = 35$。 2. 将第 2 个字的第 0 位(其值为 5 & 1 = 1)复制到同一个字的第 3 位,因此第 2 个字的值变为 5 + 2^3 = 13。 3. 然后从内存中读取 $c = 13$,并将 IP 设置为 13。

我们将第 $(2^{12} - 1)$ 个字(内存的第 $2^{16} - 16 \dots 2^{16} - 1$ 位)称为 IO-word。$x$-比较器是一个程序,用于检查 IO-word 的值是否等于 $x$。它应在执行不超过 $2^{12}$ 条指令后停止,如果 IO-word 的原始值等于 $x$,则将 IO-word 的最低位置为 1,否则置为 0。

编写一个程序,为给定的 $x$ 值生成一个 $x$-比较器。

输入格式

输入包含一个十进制整数 $x$ ($0 \le x < 2^{16}$),即要构建 $x$-比较器的目标值。

输出格式

输出应包含 $x$-比较器的程序转储。转储由内存中前 $n$ 个字的值组成 ($1 \le n \le 2^{12} - 1$)。除 IO-word 外,所有其他字均填充为零。

对于这 $n$ 个字中的每一个,将其值输出为四字符的十六进制数。值应以空格或换行符分隔。

样例

输入 1

0

输出 1

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-比较器。它由以下部分组成:

  • 16 条指令:其中第 $i$ 条(从 0 开始计数)将输入字的第 $i$ 位复制到其自身 $c$ 的第 6 位。如果复制的位为 0,它将继续执行下一条指令;否则,下一条指令的编号将增加 64。
  • 接下来的指令将第 0 个字的第 4 位(值为 1)复制到 IO-word 的第 0 位,并跳转到停止地址。
  • 16 个填充为 0 的未使用字。
  • 16 条相同的指令(从第 67 个字开始)。每条指令都将第 0 个字的第 0 位(值为 0)复制到 IO-word 的第 0 位,并跳转到停止地址。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.