bit演算での加算・減算

0 Comments
かんなつき
いわゆる範囲指定代入と言われるbit演算をやっているときの話。


4,5,6bitを使った3bit情報格納を例に見てみましょう。

参照はこんな風ですね。
(var(X)&56)/8

こうすることで0~7までの数字が参照できます。


ではここに格納されてる数字を1増やしたいときは…?

var(X):=(var(X)|56)-56+8*(1+(var(X)&56)/8)

こうでしょうか?
まあこれでもいいんですが、こうも書けます。

var(X):=var(X)+1*8

これだけ!


2増やしたいときは

var(X):=var(X)+2*8

これだけです。
こうなるのは…そもそもbitがどのようになっているかを考えればすぐわかります。

bit  1   2   3   4   5   6   7   8 
2^(bit-1) 1 2 4 8 16 32 64 128
var 0 0 0 0 0 0 0 0

今はどこの変数も使ってないので、var(X)=0ですね
では、4,5,6bitの領域で1ずつ加算してvar(X)の値がどうなるか見てみましょう。


bit  1   2   3   4   5   6   7   8 
2^(bit-1) 1 2 4 8 16 32 64 128
var 0 0 0 8 0 0 0 0

var(X)=8

bit  1   2   3   4   5   6   7   8 
2^(bit-1) 1 2 4 8 16 32 64 128
var 0 0 0 0 16 0 0 0

var(X)=16

bit  1   2   3   4   5   6   7   8 
2^(bit-1) 1 2 4 8 16 32 64 128
var 0 0 0 8 16 0 0 0

var(X)=24

bit  1   2   3   4   5   6   7   8 
2^(bit-1) 1 2 4 8 16 32 64 128
var 0 0 0 0 0 32 0 0

var(X)=32



このように、1ずつ加算して、実際の値は8ずつ増加しています。


じゃあ「8」ってなんだよ。

これはそのbit範囲の一番小さいところですね。

(var(X)&56)/8 ←ここで割ってる数字のことです。

ちなみに

var(X):=(var(X)|56)-56+8*(1+(var(X)&56)/8)

    =var(X)-(var(X)&56)+8*(1+(var(X)&56)/8) ; &を使ってbitを消す

    =var(X)-(var(X)&56)+8+8*((var(X)&56)/8) ; ()を外す

    =var(X)-(var(X)&56)+8+(var(X)&56) ; 8/8=1だから消える

    =var(X)+8

こんな風に数学みたいに式を立てて証明もできます。
こっちのほうが分かりやすいかな?


というわけで、bit演算で加減算は結構簡単にできるんだよという話でした。
オーバーフローにだけは気を付けてくださいね!
スポンサーサイト



かんなつき
Posted byかんなつき

Comments 0

There are no comments yet.

Leave a reply