我在网站上看到一篇关于它的帖子,我不明白答案,请问我能解释一下:
问题:
编写代码以确定数字是否可被3整除。函数的输入是单个位,0或1,如果到目前为止接收的数字是可被整除的数字的二进制表示,则输出应为1 3,否则为零。
示例:
input "0": (0) output 1 inputs "1,0,0": (4) output 0 inputs "1,1,0,0": (6) output 1
这是基于面试问题。我要求绘制逻辑门,但由于这是stackoverflow,我接受任何编码语言。硬件实现的奖励点(verilog等)。
部分a(简单):第一个输入是MSB。 b部分(稍微难一点):第一个输入是LSB。 c部分(困难):哪一个更快更小,(a)或(b)? (理论上不是Big-O意义上的,但实际上更快/更小。)现在采用更慢/更大的一个,并使其快/小与更快/更小的一样。
答案:
LSB的状态表:
S I S' O 0 0 0 1 0 1 1 0 1 0 2 0 1 1 0 1 2 0 1 0 2 1 2 0
说明:0可被3整除。 0&lt;&lt; 1 + 0 = 0.如果S == 0,则使用S =(S <1 + I)%3重复并且O = 1。
MSB状态表:
S I S' O 0 0 0 1 0 1 2 0 1 0 1 0 1 1 0 1 2 0 2 0 2 1 1 0
说明:0可被3整除。 0&gt;&gt; 1 + 0 = 0.如果S == 0,则使用S =(S&gt;&gt; 1 + I)%3重复并且O = 1。
S&#39;与上面不同,但是O的作用是相同的,因为S&#39;对于相同的情况(00和11)为0。由于在两种情况下O都相同,O_LSB = O_MSB,所以要使MSB像LSB一样短,反之亦然,只需使用两者中最短的。
感谢先进的答案。
答案 0 :(得分:0)
嗯,我想这个问题并非完全偏离主题,因为你问过逻辑设计,但你必须自己做编码。
S列中有3个状态。 这些跟踪当前完整输入模块3的值。因此,S0表示当前输入mod 3为0,因此可以被0整除(还要记住0可以被3整除)。 S1表示余数为1,S2表示余数为2。
I列给出当前输入(0或1),S'给出下一个状态(换句话说,新数字mod 3)。
对于'LSB',新号码是旧号码&lt;&lt; 1,加上0或1.写出表格。对于初学者,如果旧模数为0,则如果输入位为0,则新模数将为0;如果新输入为1,则新模数将为1.这将为您提供第一个表中的前两行。填补剩下的部分留给你锻炼。
请注意,如果下一个状态为0,则O列仅为1,如预期的那样。