问题描述
问题陈述
我有两种不同的模式可以使用二进制数字表示整数,如下所示:
第一个(标准的十进制到二进制的转换):
0 -> 000
1 -> 001
2 -> 010
3 -> 011
4 -> 100
5 -> 101
6 -> 110
7 -> 111
第二:
0 -> 0000
1 -> 0001
2 -> 0010
3 -> 0100
4 -> 1000
5 -> 0011
6 -> 0101
7 -> 1001
8 -> 0110
9 -> 1010
10 -> 1100
11 -> 0111
12 -> 1011
13 -> 1101
14 -> 1110
15 -> 1111
说明:首先,每个翻转一位,最高优先级到最低有效位。然后在第二次迭代中,保持第一位翻转,然后像以前一样翻转其余位。在第三次迭代中,未设置最低有效位,然后设置了第二有效位,然后继续模式。
但是,现在,我想将第一个和第二个模式组合成一个单独的模式,其中一些部分由第一个样式组成,而其他部分由第二个模式定义。例如:
(第一个模式,最多3个有效数字)(第二个模式,至少3个有效数字)
0 -> 000000
1 -> 000001
2 -> 000010
3 -> 000100
4 -> 000011
5 -> 000101
6 -> 000110
7 -> 000111
8 -> 001000
9 -> 001001
10 -> 001010
11 -> 001100
12 -> 001011
13 -> 001101
14 -> 001110
15 -> 001111
16 -> 010000
17 -> 010001
...
010111
011000
...
目标:
输入,它告诉哪一组位具有这两种模式中的哪一种(位数可以是我们想要的,模式重复可以在该组位之间无限地移动);整数。
根据输入模式将整数转换为相应二进制表示的输出。 E.g. 12 -> 001011
我困在哪里:
二进制转换很简单。第二种方式,我不太确定该怎么做。即使我可以将整数转换为第二个模式的二进制表示形式,如何将两种类型组合起来以找到与我的输入数字对应的正确的二进制等价形式?既然这里有一个模式,我敢肯定为此必须有一个优雅的数学表示!
我的用例是什么?
我正在为一个应用程序编写代码,该应用程序要基于相似的输入类型来创建类似于此二进制表示形式的搜索模式。
解决方法
假设您已经计算出一个数字的第一个模式和第二个模式。
将其转换回“普通”十进制,然后将firstNumber左移3 firstPatterNo << 3
,然后对2个数字firstPatterNo | secondPatterNo
进行或运算。
firstPatterNo = 3 // 011 (normal decimal representations)
secondPatternNo = 4 // 100 (normal decimal representations)
combined = (firstPatterNo << 3) | secondPatternNo
// Convert combined to normal binary representation
顺便说一句,第二种模式背后的逻辑是什么?我不知道。