這是從Linux內核3.12.1中取得的二進制搜索算法。因爲size_t
總是>=0
,我想知道爲什麼我們不能用>>
替換/2
?右移位與兩除之差(size_t)
/**
* @key: pointer to item being searched for
* @base: pointer to first element to search
* @num: number of elements
* @size: size of each element
* @cmp: pointer to comparison function
*/
void *bsearch(const void *key, const void *base, size_t num, size_t size,
int (*cmp)(const void *key, const void *elt))
{
size_t start = 0, end = num;
int result;
while (start < end)
{
size_t mid = start + (end - start)/2;
result = cmp(key, base + mid * size);
if (result < 0)
end = mid;
else if (result > 0)
start = mid + 1;
else
return (void *) base + mid * size;
}
return NULL;
}
我們爲什麼要更換它?對人類或電腦有任何好處嗎? – delnan
我想任何體面的編譯器都會將此表達式優化爲最有效的形式。 – Crozin
爲什麼我們不應該用純機器碼重寫內核?當然,我們可以比任何愚蠢的編譯器做得更好。 –