以下是Apple的通用二进制搜索代码。我在位操作等方面不擅长,因此这对我来说真的很难理解。我已经在我理解的部分下面的代码中进行了注释
什么是基础?这是包含值的数组吗?
如果nremain是尚未分析的数组中的值数,为什么每次迭代将其右移1?
也请帮助我了解forloop的第一行是什么。所以我的猜测是p指向其余元素的中点,但我没有得到(nremain >> 1)*宽度部分。宽度是多少?如何将nremain的右移1版本与宽度相乘将指针设置为中点?
sign> 0,当键> p和指针需要移动到下一个元素时。如何通过做p +宽度来实现?同样,知道什么宽度会很有帮助。
void *apple_bsearch(const void *key, const void *base, size_t nmemb,
size_t width, int (*compar)(const void *, const void *)) {
for (size_t nremain = nmemb; nremain != 0; nremain >>= 1) {
void *p = (char *)base + (nremain >> 1) * width; // I don't get this
// this is comparing key & where currently p is pointing
int sign = compar(key, p);
if (sign == 0) { // if p and key are equal, sign is 0
return p;
}
if (sign > 0) { // when key > p, move right
base = (char *)p + width;
nremain--;
}
}
return NULL;
}
以下是Apple的通用二进制搜索代码。我在位操作等方面不擅长,因此这对我来说真的很难理解。我已经在我理解的部分下面的代码中进行了注释...
nmemb
是数组的成员数