bool DoIntervalsOverlap(int s0, int e0, int s1, int e1)
{
return s0 - e0 <= (unsigned int) s0 - e1 || s1 - e1 <= (unsigned int) s1 - e0;
}
まず、本質的に、すべての演算は符号なしであることに注意してください。ではs0 - e0 <= (unsigned int) s0 - e1
、e1
はunsigned int
matchs0
に変換され、 はmatchにs0 - e0
変換されます。以下では、すべての演算が符号なしであると仮定します。unsigned int
(unsigned int) s0 - e1
振り返ってみると、用語を逆の順序で書いておけばよかったと思います。今すぐ修正しましょう。s0 - e0 <= s0 - e1
と同等e0 - s0 >= e1 - s0
です。e0 - s0
(これは、符号なし算術演算でも当てはまります。) ここで、 andを、 s0が原点にある参照フレームに変換さe1 - s0
れた時間e0とe1と考えることができます。このフレームでは、元のs0よりも前の時間はすべて、大きな正の数にラップされています。そのため、深夜のラッピングはなくなりました。s0から測定された非負の時間のみがあります。次に、それが「 e1は、 s0から測定して、 e0以下かどうか」を尋ねていることがわかります。e0 - s0 >= e1 - s0
?」その質問は、「 e1は [ s0 , e0 ] 内にありますか?」と同等です。</p>
したがって、2 つの条件は、「e1は [ s0 , e0 ] 内にあるか、またはe0は [ s1 , e1 ] 内にあるか?」と尋ねます。いずれかの間隔が他方の内側で終了する場合、間隔は重複します。どちらも他方の内側で終わらない場合、それらは重なりません。