LoginSignup
1
0

🧶分岐なしで絶対値を取り取り:a = x >> 63; x ^ a - a

Posted at

絶対値を取る最も簡単な方法は、ifを使うことだと思います。

でも、これは今のCPUが賢いので遅いです。
なぜかというと、CPUはifの条件にメモリアクセスが必要など、条件がtrueかfalseか計算するのに時間がかかることがあるので、trueかfalseか分岐を予測して実際に計算し終わる前にifの中身を実行するのですが(分岐予測/Branch predictionといいます)、分岐の予測が外れていたら世界を巻き戻さないといけないため、魔法の時計はないから大変なので、ifは使いたくありません。

ifなしで絶対値を取るには、魔法のようにビット演算を駆使します。(int64の場合で説明します)

xが絶対値を計算したい対象だとすると、

  1. xを63ビット算術右シフトします。この結果をaとします。これで正の数の場合はすべてのビットが0(=0)、負の数の場合はすべてのビットが1(=-1)になります。

  2. xとaをxorして(xが負ならnotされる)、aを引きます(xが負なら-(-1)なので+1される)(notして1足すと正負を反転できます(詳しくは「🧶「-x」の速い計算方法:^x + 1の解説」をお読みください))

つまり、xが正なら何もせず、負ならnotして+1するってことです!

これで高速に絶対値が計算できた!やったね!

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0