剰余のうんちく

はじめに

方向を以下のように定義しておく

  • 上(0度):0
  • 右(90度):1
  • 下(180度):2
  • 左(270度):3

すると、90*n度回転させる処理はそのまま足し算で実行できる。
だが、1回転した場合0-3に正規化する必要がある。
この処理のお話。

剰余の限界

この正規化を行う為にすぐ思い付くのは、剰余を使い、

n%4

とすることである。

問題はこのnがマイナスになった場合で、例えば-1%4とかやると、処理系によって解が異なる。

Python「3だよ!」
Java「-1だよ!」

Javaさん冗談ですよね。

剰余の種類

この違いは、どちらも仕様書に由来する訳だが、数学的にはPythonのような奴を正剰余、Javaのような奴を負剰余と呼ぶらしい。なるほど。で今回は正剰余が欲しい。

結局こうした

ところで4って2進数だと100だよね。その余りってこうやったら求められないかい?

n&3

nがマイナスでも、これは処理系に依存せず、正剰余を返す。(詳しくはコンピュータの負数表現なんかを調べてくれ)

わーい(パチパチ

補足

ところでJavaとかGroovyで正剰余を計算する方法は無いんですかね