【发布时间】:2020-04-05 00:15:28
【问题描述】:
这就是问题所在,我正在用 C 语言构建 128 位数组来表示节拍分区,这些分区可以在逻辑上相互进行与/或/异或运算,因此您可以得到如下结果。我遇到的问题是,如何确定模式何时重复,以及第一个重复部分的开始/结束索引是什么,以便我可以循环遍历该部分以防止在达到最大值时发生奇怪的事情(目前128)。
似乎我需要将大小增加到 256 或更大,以解决更复杂的嵌套逻辑创建一段时间不重复的模式的情况。寻找有关如何检测位数组中的模式算法盟友。
2: 01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
3: 00100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100
3 OR 2: 01110101110101110101110101110101110101110101110101110101110101110101110101110101110101110101110101110101110101110101110101110101
3 AND 2: 00000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100
3 XOR 2: 01110001110001110001110001110001110001110001110001110001110001110001110001110001110001110001110001110001110001110001110001110001
|| || || || || ...
5: 00001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000
5 OR (3 XOR 2): 01111001110001110001110011110101111001110001110001110011110101111001110001110001110011110101111001110001110001110011110101111001
|| || || || ||
5 OR (3 OR 2): 01111101110101110101110111110101111101110101110101110111110101111101110101110101110111110101111101110101110101110111110101111101
|| || || ||
5: 00001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000010000100001000
6: 00000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100000100
5 OR 6: 00001100010100100101000110000100001100010100100101000110000100001100010100100101000110000100001100010100100101000110000100001100
|| || || || ||
7: 00000010000001000000100000010000001000000100000010000001000000100000010000001000000100000010000001000000100000010000001000000100
7 XOR (5 OR 6): 00001110010101100101100110010100000100010000100111000111000100101100000100101101000110000110001101010100000101010110001100001000
shoot, 7 XOR (5 OR 6) doesn't repeat within 128 bits..
8: 00000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001
16: 00000000000000010000000000000001000000000000000100000000000000010000000000000001000000000000000100000000000000010000000000000001
为了提供更多背景信息,这是我为音乐模块 (https://llllllll.co/t/chrono-sage-meadowphysics-logical-clock-divider-v1-2-5/27182) 编写的逻辑时钟分频器,我要解决的问题是拥有这些逻辑/嵌套逻辑的能力节拍分区的组合排列整齐,因此当图案环绕时不会出现卡顿。
【问题讨论】:
-
您识别重复模式的标准是什么?
-
由于这些是通过逻辑操作创建的,我想说的标准是至少检测到两次模式,初始和第二次重复将确认第一个模式可以提供开始/结束索引,我可以获得长度和初始偏移量。 (偏移,因为未知数量的初始位不太可能是重复模式的一部分)。上面的线条标记模式开始/结束的位置。
-
所以“1001”将是“111100110011001111111”中的重复模式?事实上,如果 xxx 出现,任何字符串 x 都会被视为重复模式?
-
除非我犯了错误(这是可能的),似乎对于 M 和 N 位的任意组合,无论是 M*N 还是可以被两者均分的第一个正整数 M和 N 应该给你一些保证均匀地适应重复的位,例如'7 XOR (5 OR 6)' 为 210 位。 (实际的重复当然可能比这更短。)我不确切知道目标和约束是什么,但也许可以以某种方式加以利用。
-
我认为您需要从可能的最长重复模式开始,然后从那里检查到最短的模式,否则您可能会将短重复误认为是模式,而实际模式较长(例如,1010110010101100有两次重复 10 但模式是 10101100)。所以首先检查后半部分是否等于前半部分。如果是,则递归地继续减半以找到最小长度。如果不是,则模式被偏移或截断......
标签: c algorithm binary logic logical-operators