2017-09-29 11 views
-2

は、私はそれについてサイト上の記事を見て、私は答えを理解していなかった。チェック

質問:

数値が3で割り切れるかどうかを判断するコードを書く。関数への入力は1ビット、0または1であり、これまで受信した数値が3で割り切れる数値のバイナリ表現であれば1になる。ゼロ。

例:

input "0": (0) output 1 inputs "1,0,0": (4) output 0 inputs "1,1,0,0": (6) output 1

これは面接の質問に基づいています。私は論理ゲートの描画を頼みますが、これはスタックオーバーフローなので、私はどのコーディング言語も受け入れます。ハードウェア実装(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で割り切れます。 MSB 0 < < 1 + 0 = 0繰り返し使用S =(S < < 1 + I)%3及びO = 1の場合のS == 0

状態テーブル:

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 = 1 + 0 = 0 S == 0の場合、S =(S >> 1 + I)%3、O = 1を使用して繰り返します。

S 'は上記とは異なりますが、同じ場合(00と11)についてはS 'が0であるためです。どちらの場合もOは同じなので、O_LSB = O_MSBなので、MSBをLSBと同じくらい小さくするには、どちらか最短のものを使用してください。

アドバイスをいただきありがとうございます。

+0

これはコーディングサービスではありません。あなたが星に何かを見せたら、おそらくいくつかの身体が少しの助けを加えることができます。 – Ripi2

+0

@ Ripi2笑私はあなたが質問と答えを与えたことを理解している投稿を読んでも答えが出た...私はちょうど答えを理解していなかったし、それを理解しようとしています。 – shmulikm

答えて

0

あなたは論理設計について尋ねたので質問は完全にオフトピックではないと思いますが、自分でコーディングを行う必要があります。

S列には3つの状態があります。 これらは、現在の全入力モード3の値を追跡します。。したがって、S0は現在の入力mod 3が0であることを意味し、したがって0で割り切れる(0は3で割り切れることにも注意してください)。 S1は剰余が1であり、S2は剰余が2であることを意味する。

I列は現在の入力(0または1)を与え、S 'は次の状態(換言すれば新しい数mod 3) 。

'LSB'の場合、新しい番号は古い番号< <1に0または1を加えたものです。テーブルを書き出します。最初のモジュロが0の場合、新しいモジュロは入力ビットが0の場合は0になり、新しい入力が1の場合は1になります。これにより、最初のテーブルの最初の2行が得られます。残りの部分は、練習として残しておきます。

期待どおり、次の状態が0の場合、O列は1にすぎないことに注意してください。

+0

ありがとう!!私はそれをコード化する必要はありません、ちょうど答えを理解したいと思って、あなたは私に完全に答える!ありがとう! – shmulikm