絶対値を取る最も簡単な方法は、ifを使うことだと思います。
でも、これは今のCPUが賢いので遅いです。
なぜかというと、CPUはifの条件にメモリアクセスが必要など、条件がtrueかfalseか計算するのに時間がかかることがあるので、trueかfalseか分岐を予測して実際に計算し終わる前にifの中身を実行するのですが(分岐予測/Branch predictionといいます)、分岐の予測が外れていたら世界を巻き戻さないといけないため、魔法の時計はないから大変なので、ifは使いたくありません。
ifなしで絶対値を取るには、魔法のようにビット演算を駆使します。(int64の場合で説明します)
xが絶対値を計算したい対象だとすると、
-
xを63ビット算術右シフトします。この結果をaとします。これで正の数の場合はすべてのビットが0(=0)、負の数の場合はすべてのビットが1(=-1)になります。
-
xとaをxorして(xが負ならnotされる)、aを引きます(xが負なら-(-1)なので+1される)(notして1足すと正負を反転できます(詳しくは「🧶「-x」の速い計算方法:
^x + 1
の解説」をお読みください))
つまり、xが正なら何もせず、負ならnotして+1するってことです!
これで高速に絶対値が計算できた!やったね!