格雷码:循环移位与异或

C++ Hard loops

任务 «格雷码:循环移位与异或»

给定一个整数 N(1 ≤ N ≤ 20)。生成一个由 2^N 个数组成的序列,这些数表示从 0 到 2^N-1 的格雷码。然后,对于该序列中的每个数,将其二进制表示循环右移 1 位,并与原数进行 XOR 操作。按照原数的升序输出得到的结果。仅使用循环和位运算,避免递归。

输入格式

一个整数 N (1 ≤ N ≤ 20)。

输出格式

2^N个整数,用空格分隔,每个整数占一行。

示例

示例 1

输入
3 1 2 3 4 5 6 7 8 9
输出
15

示例 2

输入
1 5
输出
1 2 4 8 16

示例 3

输入
5 1 2 3 4 5 2 3
输出
12

示例 4

输入
3
输出
1 0 0 2 0 4 4 6
main.cpp