ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
11月 23 (金曜日) 2007
17:06
今週のハマり所メカ、発進!
 
ポチっとな!??

ここでヘコヘコとVGA書き込みの実験してたんだけど、そこでドッパまってしまったのでメモ〜。

右シフト演算はできるだけ避ける、もしくはできるだけunsigned型を使うようにしよう!

つーことらしい。

なにやってたかって言うと、マスク用変数を作りたかった。
たてえば、左から4ビットだけ0で後はみんな1とかそういうのを作りたかった。(この場合、何ビットずらすかがその都度不定なのでビットシフトを使っていた)

で、こうしてたんだよねぇ・・・・

char aaa;
aaa = 0xFF; //まずは1111111111111111bを作って・・・

aaa = aaa >> 4; //この4は演算で出る値なので固定値ではない

//やったぞ! これで、0000111111111111bができたぞ!

ところがこれが、何回やってもうまく行かない・・・orz

で、いろいろ調べてたら分かったわけ。正解はこれ。


unsigned char aaa;
aaa = 0xFF; //まずは1111111111111111bを作って・・・

aaa = aaa >> 4; //この4は演算で出る値なので固定値ではない

//やったぞ! これで、0000111111111111bができたぞ!


いや〜〜〜・・・・ ハマったハマった・・・(^^;

ちょっと補足。なんで右シフトは避けたほうがいいのか?。左シフトは空いてしまったビットが必ず0で埋められることが確約されているが、右の場合、unsignedかそうでないか等、いくつかの条件下で必ずしも0にならないかららしい。なので、左シフトと同じ感覚で使うとオイラのようにハマりまくることがよくあるからだそうだ。もちろんそれを想定・過程した上でなら問題ないのだろうが・・・。参考までに。

 
30日を過ぎたBlogにはコメントできません。
(1) 

PopnupBlog V3 Denali created by Bluemoon inc.