見出し画像

算術右シフトと負の割り算

基本情報技術者試験とかでシフト演算が出てくると思います。10進数の425を10倍すると桁を一つ左にずらして一桁目を0にして4250になり、10で割ると42余り5と下の桁が弾き出されるように、2進数でシフト(移動)するやつです。細かい定義は知りません。

例:10進数で「13」の「00001101」を1ビット左シフト(左に一桁ずつ移動して一桁目に0を埋める)すると「00011010」となる。「00011010」は10進数で「26」なので2倍されている。

シフト演算で問題になるのは負の数で右シフトした時で、0を入れると上手くいかなくなってしまいます。負の数は2の補数なので0で埋めると絶対値がおかしくなるわけですね(2の補数は反転して1を足して求める)。そこで右シフトでは符号ビットで埋めます。

1の補数は足すと桁が上がらずに全て1になる数。
0110なら1001(0110+1001=1111)。

2の補数は足すと桁が増えて最上位の桁以外は0になる数。
0110なら1010(0110+1010=10000)。
足すと全て0になるので負の数として利用されていたりする。2の補数を求める時は反転して1を足せば良い(0110を反転して1001、1を足して1010)。

そんなシフト演算を調べていたら以下のような記述を見かけました。

これは、-2 を表す2の補数表現である。 つまり、-3 を1ケタ右にずらしても、-2にしかならず、 -3 を 2 で割った商である -1 にはならない。

2の補数表現における演算

11111101を右に一桁ずらすと、1が余ります。
商×除数+剰余=被除数だから、

-2×2+1=-3

なので「-2」で良いのでは?と思いました。
余りを負にしたければ「-1×2+(-1)=-3」とすれば良いですよね。

丁度、-3を2で割った時について解説しているTry Itの記事では余りは正の数でないといけないようにも書いてあります。

「余り」は「余ったもの」のことだから、 「たし算」 の形で書かないといけない。

【高校数学A】「負の整数の「商と余り」」 | 映像授業のTry IT (トライイット)

余りを負にするかは定義次第のように書かれているものもあります。

数学(算数?)出来ない人間なので「-3 を 2 で割った商である -1」という表現がどういう意味か分かりません。余りを正とすれば算術右シフトは成立しているという理解で良いのでしょうか?詳しい人は教えてください。

出来ることが増えると記事に還元されます。コメント頂ければ参考にします。