« 一番右のbitをオフ | Main | 今日の日記 »

2005.04.05

左も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 | 今日の日記 »

Comments

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference 左もOFFにしたいよね:

« 一番右のbitをオフ | Main | 今日の日記 »