C 如何确定单个数组中位的重复模式
这就是问题所在,我正在构建128位的数组,用C来表示节拍除法,这些除法可以在逻辑上和/或/XOR'd相对,所以可以得到如下结果。我面临的问题是,如何确定模式何时重复,以及第一个重复部分的开始/结束索引是什么,这样我就可以循环该部分,以防止在达到最大值(当前为128)时发生奇怪的事情 似乎我需要将大小增加到256或更大,以考虑更复杂的嵌套逻辑创建的模式在一段时间内不会重复的情况。。正在寻找关于如何在一个位数组中检测模式算法联盟的建议C 如何确定单个数组中位的重复模式,c,algorithm,binary,logic,logical-operators,C,Algorithm,Binary,Logic,Logical Operators,这就是问题所在,我正在构建128位的数组,用C来表示节拍除法,这些除法可以在逻辑上和/或/XOR'd相对,所以可以得到如下结果。我面临的问题是,如何确定模式何时重复,以及第一个重复部分的开始/结束索引是什么,这样我就可以循环该部分,以防止在达到最大值(当前为128)时发生奇怪的事情 似乎我需要将大小增加到256或更大,以考虑更复杂的嵌套逻辑创建的模式在一段时间内不会重复的情况。。正在寻找关于如何在一个位数组中检测模式算法联盟的建议 2: 0101010101010101
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
为了提供更多的上下文,这是我为音乐模块()编写的一个逻辑时钟除法器,我试图解决的问题是,能够将这些节拍除法的逻辑/嵌套逻辑组合排列起来,这样在模式缠绕时就不会出现口吃。伊恩·艾伯特评论说“重复模式的长度不应超过M和N的最小公倍数”(我假设M和N是两个,尽管您已经展示了组合两个以上的示例)。事实上,超过一米的简单组合正好是长度等于其长度的重复模式 但看起来你在做额外的、任意的选择,如示例中的线条所示,关于你希望“重拍”的位置。从表面上看,如果没有更多的澄清,我们将很难告诉计算机这些标准是什么。你在想什么(或者更好的是,听)这就建议你把节拍放在你做过的地方,而不是放在例子的开头?或者问题是我们无法访问合并的原始米数
3/4 x . x|x . x|x . x|x . x
4/4 x . x x|x . x x|x . x x
(lcm = 12)
识别重复模式的标准是什么?因为这些是通过逻辑操作创建的,我想说的是,标准是模式至少被检测两次,初始和第二次重复将确认第一个模式可以提供开始/结束索引,我可以从中获取长度和初始偏移量。(偏移量,因为未知数量的初始位不可能是重复模式的一部分)。上面的行标记了模式开始/结束的位置。因此“1001”将是“11110011001111111”中的重复模式?事实上,如果出现xxx,任何字符串x都将被视为重复模式?除非我犯了错误(这是可能的),似乎对于M位和N位的任何组合,M*N或可被M和N平均除的第一个正整数都应为您提供保证均匀适合重复的位数,例如,对于“7 XOR(5或6)”,为210位。(实际重复当然可能短于此。)我不知道具体的目标和限制是什么,但也许可以通过某种方式加以利用。我认为你需要从尽可能长的重复模式开始,然后检查从那里到最短的重复模式,否则你可能会错误地将短重复模式误认为是模式,而实际模式则更长(例如,10101100100有两个10的重复,但图案是10101100)。因此,首先检查后半部是否等于前半部。如果是,则递归地继续减半以找到最小长度。如果不是,则图案是偏移或截断的。。。