シフト演算って何?【応用情報技術者試験対策】
シフト演算についてざっくりメモ。
シフト演算とは?
PCが演算で、2^nのような計算をする場合に、シフト(桁を移動)することで高速化するための仕組みで、基本的に2進数で考える。
算術シフトと論理シフトがあり、それぞれ左シフトと右シフトがある。
算術シフト
符号を考慮したシフト演算で、最上位のビットは固定したまま他のビットをシフトする。左、右のシフト例を下記しておく。
例:シフト前:1011 (-5)※1. 10進数
・左シフト:1110(-2)
・符号ビットを除いた一番左の1はオーバーフローして消える
・一番右が1つ空くので0が挿入される
・左シフトは符号を考慮しない、する、というサイトがある…。
(Bingも考慮しない派だけど、実際どっちなんだ…?
日高哲郎さんの書籍には符号を考慮せよ、とあるので考慮派)
・右シフト:1101(-3)
・一番右の1はオーバーフローして消える
・一番左が1つ空くので符号と同じ1が挿入される
※1.マイナスの数値を出す場合は1111とXORを取って+1と覚えると楽。
論理シフト
符号は考慮されないため、全体をシフトする。
左シフトなら2^n、右シフトなら2^-nされる。
左右のシフト例は下記。
例:シフト前:1011 (11)※1. 10進数
・左シフト:0110(6)
・一番左の1はオーバーフローして消える
・一番右が1つ空くので0が挿入される
・右シフト:0101(5)
・一番右の1はオーバーフローして消える
・一番左が1つ空くので0が挿入される
乗算と除算の具体的な方法
下記サイトが分かりやすかったのでメモ。
2進数化 → 補数チェック → 各桁シフトした結果を加算減算する。
符号の考慮についてはもう少し調べないと。
内容に相違などあればご指摘くださいー。