【问题标题】:How to determine repeating pattern of bits in a single array如何确定单个数组中位的重复模式
【发布时间】: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


【解决方案1】:

Ian Abbott 评论说“重复模式不应超过 M 和 N 的最小公倍数”(我认为 M 和 N 是两个 metres,尽管您已经展示了结合两个以上的示例) .事实上,超过一米的简单组合恰好是长度等于它们least common multiple的重复模式。

但您似乎正在做出额外的、任意的选择,如示例中的行所示,您希望在哪里“悲观”。从表面上看,如果没有更多的说明,我们很难告诉计算机这些标准是什么。你在想什么(或者更好的是,听到)建议你把强拍放在你做过的地方,而不是在例子的开头?还是我们无法访问合并后的原始仪表的问题?

3/4 x . x|x . x|x . x|x . x
4/4 x . x x|x . x x|x . x x
(lcm = 12)

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2017-10-18
    • 1970-01-01
    • 2013-01-25
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多