beroの日記: 2^nの定数除算は最適化で右シフトにならない 1
日記 by
bero
unsigned の除算は右シフトになりますがintの除算は右シフトだけになりません。
理由は逆汗
3つまり00...011を1ビット右シフトすると00....01つまり1になりますが、
-3つまり11...101を1ビット右シフトすると11....10つまり-2になります。
これは対称性がなくて除算の結果と異なるので、負のときは調整してからシフトするようなコードになります。
あと流れ的に
unsigned の(2^nの定数の)除算は
のつもりだったので
はまた別の話。
2^nでない一般の整数は、固定小数点による逆数の乗算とかになります。
ただ負の場合は調整が必要というのは同じで
VC++コード
shr eax,31 ;
で、負の場合ffffffff(-1),正の場合0になるので、
add eax, edx
正の場合そのまま、負の場合は-1を足しています。(条件分岐を減らす基本テク)
#こういう問題もあるし、配列インデックスのように正の値しかとりえない変数はunsigned(またはそれをtypedefしたもの)を積極的に使うべきと思ってるのだが
#誤字直した。指摘thanks
s/対象性/対称性/ (スコア:1)