パスワードを忘れた? アカウント作成
40720 journal

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の定数の)除算は
のつもりだったので

ときどきの雑記帖 i戦士篇

はまた別の話。
2^nでない一般の整数は、固定小数点による逆数の乗算とかになります。
ただ負の場合は調整が必要というのは同じで
VC++コード
        shr eax,31 ;
で、負の場合ffffffff(-1),正の場合0になるので、
        add eax, edx
正の場合そのまま、負の場合は-1を足しています。(条件分岐を減らす基本テク)

#こういう問題もあるし、配列インデックスのように正の値しかとりえない変数はunsigned(またはそれをtypedefしたもの)を積極的に使うべきと思ってるのだが

#誤字直した。指摘thanks

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...