Ken Pizzini <tz.@explicate.org> writes:
On Fri, Feb 24, 2006 at 01:28:43PM -0800, Paul Eggert wrote:
+ int lo = 1; + int hi = sp->timecnt; + for (;;) { + i = (lo + hi) >> 1; + if (hi <= lo) break; + if (t < sp->ats[i]) + hi = i; + else + lo = i + 1; + } i = (int) sp->types[i - 1];
The loop control on that strikes me as a bit odd (not wrong, just odd). How about using simple "while" instead? int lo = 1; int hi = sp->timecnt; while (lo < hi) { i = (lo + hi) >> 1; if (t < sp->ats[i]) hi = i; else lo = i + 1; } i = (int) sp->types[lo - 1];
(My guess is that you were unintentionally intent on keeping the "i" in the sp->types[] dereference of the original code, for which your code is about as good as it gets.)
Yes, your guess is right. I like your simple "while" better. Thanks. Better yet would be to not reuse "i", e.g., something like this: int lo = 1; int hi = sp->timecnt; while (lo < hi) { int mid = (lo + hi) >> 1; if (t < sp->ats[mid]) hi = mid; else lo = mid + 1; } i = (int) sp->types[lo - 1];