論理シフト
logical shift
ビット演算のひとつ
右シフト: >>
1011 >> 1 = 0101
符号付き整数への動作が異なる
論理右シフト: >>>
-4 = 0b1111_1100
0b1111_1100 >>> 2 = 0b0011_1111 = 63
算術右シフト: >>
符号を考慮した動作になっている
-4 = 0b1111_1100
0b1111_1100 >> 2 = 0b1111_1111 = -1
右シフトは2で割っていくのと同値の演算
>>> 1は2で割るのと同値の演算になる
というのが『数学ガールの秘密ノート/ビットとバイナリー』にもあるあんも.icon
左シフト: <<
1011 << 1 = 0110
算術/論理左シフト: <<
左シフトは2倍していくのと同値の演算
オーバーフローを考えない限りあんも.icon
シフト演算による割り算もそれなりに高コスト
@yuniruyuni: これめちゃめちゃ影響あって、マリオワールドのRTAプレイヤーのチャートにはちゃーんと「処理落ちを抑えるために"スコアの格桁の数字の合計値"をなるべく小さな数字にする」って書いてあります。なぜなら割り算がないので「各桁の数字をループで可能な限り引き算する」というアルゴリズムになってて、
高速逆平方根を考えるモチベーション
@Bear212No: @yuniruyuni ちなみに割り算がなくても割り算は出来ます。
逆数となる数字をかけてLMBを必要分だけ取ればいいので、割る数がconstantである状況なら2-3cycleで行けます。
当然、商と余りは一括で計算しましょう。
Hacker's Delightは基礎教養( ゚д゚ )クワッ!!
逆数の掛け算で割り算?あんも.icon