我试图想出一个算法来实现给定的n位二进制数。我尝试了很多例子,但我找不到任何模式。那我该怎么办呢?
答案 0 :(得分:2)
这个怎么样:
将数字转换为基数4(通过简单地组合位对,这是微不足道的)。基数4中的5是11.可被11整除的基数4有点熟悉:11,22,33,110,121,132,203,......
11的可除性规则是你添加所有奇数和所有偶数并从另一个中减去一个。如果结果可以被11整除(记住是5),那么它可以被11整除(记住是5)。
例如:
123456d = 1 1110 0010 0100 0000b = 132021000_4
The even digits are 1 2 2 0 0 : sum = 5d
The odd digits are 3 0 1 0 : sum = 4d
Difference is 1, which is not divisble by 5
或另一个:
123455d = 1 1110 0010 0011 1111b = 132020333_4
The even digits are 1 2 2 3 3 : sum = 11d
The odd digits are 3 0 0 3 : sum = 6d
Difference is 5, which is a 5 or a 0
这应该有一个相当有效的硬件实现,因为它主要是位切片,接着是N / 2个加法器,其中N是你感兴趣的数字中的位数。
请注意,在添加数字和减去后,最大值为3/4 * N,因此如果您最多有16位数字,则最多可以获得12个,因此您只需要检查0 ,±5和±10明确。如果您使用32位数字,那么结果最多可以得到24,因此您还需要检查结果是否为±15或±20。
答案 1 :(得分:2)
制作确定性有限自动机(DFA)以实现可分性检查并在硬件中实现DFA。
创建DFA以便将其除以5是很容易的。你只需要注意余数并检查2r(mod 5)和2r + 1(mod 5)映射到的是什么。有很多网站都在讨论这个问题。例如this one。
有一些众所周知的例子可以将DFA转换为硬件表示。
答案 2 :(得分:1)
好吧,我刚想通了...... 数字mod 5 = a0 * 2 ^ 0 mod 5 + a1 * 2 ^ 1 mod 5 + a2 * 2 ^ 2 mod 5 + a3 * 2 ^ 3 mod 5 + a4 * 2 ^ 4 mod 5 + .... = a0(1)+ a1(2)+ a2(-1)+ a3(-2)+ a4(1)重复......
因此奇数位的差异+偶数位差的2倍=可被5整除
例如......考虑110010
奇数位数= 0-0 + 1 = 1或01
偶数差= 1-0 + 1 = 2或10
奇数位的差异+偶数位差的2倍= 01 + 2 *(10)= 01 + 100 = 101可被5整除。
答案 3 :(得分:1)
每个位对可被5整除的贡献是四位模式3421。 您可以一次移动任意二进制数4位,为正位添加相应的值。
示例:
100011
拿p1 应用模式0021 总和3接下来的四位0010 应用模式0020 sum = 5
答案 4 :(得分:0)
任何作为答案的任务一定会在一年之后过期:
(这完全等同于JoshG79,notsogeek或james:4≡-1(mod 5),3≡-2(mod 5)的答案(在论证中减少了关于递归的挥手,并且没有可靠的处理载体在电路中))