(如果知道二进制,可以跳过这一部分,直接听题)
各位同学知道二进制是什么吗?
二进制是一种以2为基数的计数系统,通常用两个不同的符号0和1来表示。二进制与十进制有如下转换关系
在这里,我仅介绍一种将十进制转化为二进制的方法:
十进制转二进制可以用除2取余法来进行。这个方法的步骤是不断将十进制数除以2,记录每次的余数,直到结果为0。然后,将余数从下往上排列,得到二进制表示。
转换步骤
\1. 将十进制数除以2,得到一个商和余数。
\2. 将商继续除以2,再记录余数。
\3. 重复步骤,直到商为0。
\4. 将所有余数从最后一个到第一个排列起来,得到二进制结果。
示例
以十进制数18为例:
\1. 18 ÷ 2 = 9,余数 0
\2. 9 ÷ 2 = 4,余数 1
\3. 4 ÷ 2 = 2,余数 0
\4. 2 ÷ 2 = 1,余数 0
\5. 1 ÷ 2 = 0,余数 1
从下往上排列余数,结果是 10010。
所以,十进制的18在二进制中表示为 10010。
而二进制有自己的计算逻辑,这里仅介绍需要用到的这种:按位或。
当多个二进制数进行按位或时,依次对比每一位数,只要任意一个数这一位是“1”,这一位的结果就是“1”,反之则是“0”。
例如:10,12,16这三个数做按位或。
我们知道10的二进制数是01010,12的二进制数是01100,16的二进制数是10000
就有下面这个计算
01010 (10) |
01100 (12) |
10000(16)
---------
11110(30)
所以这三个数按位或的结果为30。
现在,请听题。Ayin有一个无限长的自然数字串,也就是1,2,3,4,5,6,7,8,9......,他需要进行若干次操作来得到一个新的数字串。具体操作如下:
对于除了第一位的数字,其他所有数字和它两侧的数字做按位或运算,运算结果放在这个数字原位,也就是在第一次操作中,2需要和1,3做按位或,结果为3,那么新数字串的第二位就是3。
对于第一个数字,它只与它右边的一个数字做按位或运算,也就是在第一次操作中,1只需要和2做按位或,结果为3,那么新数字串的第一位也是3。
那么我们很容易知道,在进行一次操作后,数字串会变成3, 3, 7, 7, 7, 7, 7, 15, 15, 11, 15, 15, 15, 15, 15, ...两次操作后,数字串为3, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15, 15, ...
现在你需要回答的是在进行x次操作后,第y位数是什么(十进制输出)