制作日記

こういうの作った方が、逃げにくいじゃない

MUGENでシフト演算

演算子で忘れてるのないか調べてたときに見かけたから書いてみる
シフト演算については知ってること

算術シフトだけ考える
論理シフトは算術シフト+αでできるから、割愛

左シフトは2の累乗で掛けるだけ、終わり

次、右シフト
右シフトの再現として真っ先に思いつくのは2の累乗で割ること
でも、2の累乗での除算と右シフトは等価ではない
違いは何かというと、丸め方向

MUGENの整数除算では、演算結果に対して0方向への切り捨てが行われる
除算結果が1.5とか小数点以下を含む場合、答えを1にするか2にするかって話
で、小数点以下を切り捨てて0に近い方を答えとすることを0方向への切り捨てって言う

対して、右シフトを除算ととらえた場合、
下方向への丸めが行われている
これは、1.5なら1と2で値の小さい方を答えにすること

シフト対象が正数なら問題ないけど、負数になった時に問題が出てくる
-3/2は-1だけど、-3>>1は-2
-1/2は0だけど、-1>>1は-1のまま
-1をどれだけ右シフトしたって-1のまま、2での除算とシフトは全然違う

負数の除算で何が問題かって言うと、小数以下からの繰り上げ
これさえなければ右シフトと等価になるんだから、
除算結果が整数になるように事前に調整すれば良い
つまり、xビットシフトしたいときは、下位xビットを全部0にしてから除算する

よって、yをxビットシフトしたいときは
(y & (-ceil(2.0 ** x))) / ceil(2.0 ** x)
これで行ける
yは正数でも負数でも問題ない

コメントの投稿

非公開コメント

プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク