【C言語】2の補数のおかげ?
2010年3月3日 お仕事そんな方法があったのか?!とちょっと感心した話。
0,1,2,3,4,5,6,7,0,1,2,3,4…のようにカウントアップorダウンして0未満もしくは一定の数以上の値になった場合、一定の数の剰余になるような処理を実装するとして、一定の数が2のべき乗であったときの方法。
例えば、一定の数=8だった場合、
10→2
-2→6
となるようにするには…
なんか、0x7でマスクすれば良いみたい。
(ただ、変数の大きさには注意)
(00001010)2 :(10)10 を
(00000111)2 :(07)10 でマスクすると、
(00000010)2 :(02)10 となる。
同様に、
(11111110)2 :(-2)10 を
(00000111)2 :(07)10 でマスクすると、
(00000110)2 :(06)10 となる。
処理を見たとき前者の正の数の場合は予想が付いたのですが、
負の数に関しても大丈夫ということまでは考えが至りませんでした。
まだまだ知らないことが多いなぁと思った今日。
0,1,2,3,4,5,6,7,0,1,2,3,4…のようにカウントアップorダウンして0未満もしくは一定の数以上の値になった場合、一定の数の剰余になるような処理を実装するとして、一定の数が2のべき乗であったときの方法。
例えば、一定の数=8だった場合、
10→2
-2→6
となるようにするには…
なんか、0x7でマスクすれば良いみたい。
(ただ、変数の大きさには注意)
(00001010)2 :(10)10 を
(00000111)2 :(07)10 でマスクすると、
(00000010)2 :(02)10 となる。
同様に、
(11111110)2 :(-2)10 を
(00000111)2 :(07)10 でマスクすると、
(00000110)2 :(06)10 となる。
処理を見たとき前者の正の数の場合は予想が付いたのですが、
負の数に関しても大丈夫ということまでは考えが至りませんでした。
まだまだ知らないことが多いなぁと思った今日。
コメント