左もOFFにしたいよね
ハッカーの楽しみ続き。
そのすぐ後に、最下位で立っているbitだけを取り出す式が書いてあった。
x & (-x)
でいろいろと小技が書いてあり、「(足し算のように)右のbitから左へ
計算する場合、あるビット列とあるビット列を対応させる関数は、add、
sub、and、or、notを使って実装できる」という意味の事が書いてある。
右から左というのがポイントで、LSBを取り出すことはできても、MSBを取り
出すことはできない。なぜなら、右から左へ演算していくのに、あるbitが
MSBかどうかはそのbitより左側を調べないといけないからである。
で、ここまでが、この本の範囲。
なんで、LSBが取れてMSBが取れないのか、しかと考える。
ワカッタ!演算に使っているaddとsubが右から左に計算するから。
LSBをoffする計算式 x & (x - 1) では、x-1がミソだ。&の演算に右も
左もない。これが決められた命令セットでしか演算ができないソフトの
限界。でも、ハードならMSB落とすのも簡単だ。
assign indata_inv[0] = indata[7];
assign indata_inv[1] = indata[6];
(中略)
assign indata_inv[7] = indata[0];
のように入り口で、MSB、LSB取り替えて、
outdata_inv <= indata_inv & (indata_inv - 1);
計算結果を出口でひっくり返せば良い。リソースもadder1個で全く
同じはずだ。
Veritakで同じように計算して、ちゃんと動いていることを確かめる。
回路はこれとこれ。
これで一つレベルアップだ。MSBやLSBどちらからでも、特定のbit取り出したり
マスクしたり自由自在。この本最高だ。
« 一番右のbitをオフ | Main | 今日の日記 »
The comments to this entry are closed.
Comments