将给定的整数转换为自定义二进制表示的算法



问题陈述

我有两种不同的模式来表示使用二进制数字的整数,如下所示:

第一个(标准的十进制到二进制转换(:

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个CCD_ 2,然后对2个数字CCD_。

firstPatterNo = 3 // 011  (normal decimal representations)
secondPatternNo = 4 // 100  (normal decimal representations)
combined = (firstPatterNo << 3) | secondPatternNo
// Convert combined to normal binary representation

顺便问一下,第二种模式背后的逻辑是什么?我想不通。

最新更新