请为我解释这个二进制搜索功能

问题描述 投票:0回答:1

以下是Apple的通用二进制搜索代码。我在位操作等方面不擅长,因此这对我来说真的很难理解。我已经在我理解的部分下面的代码中进行了注释

  1. 什么是基础?这是包含值的数组吗?

  2. 如果nremain是尚未分析的数组中的值数,为什么每次迭代将其右移1?

  3. 也请帮助我了解forloop的第一行是什么。所以我的猜测是p指向其余元素的中点,但我没有得到(nremain >> 1)*宽度部分。宽度是多少?如何将nremain的右移1版本与宽度相乘将指针设置为中点?

  4. sign> 0,当键> p和指针需要移动到下一个元素时。如何通过做p +宽度来实现?同样,知道什么宽度会很有帮助。

  5. <<
  6. 谢谢!我期待收到任何人的回覆。
  7. 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的通用二进制搜索代码。我在位操作等方面不擅长,因此这对我来说真的很难理解。我已经在我理解的部分下面的代码中进行了注释...

c bit-manipulation bit-shift
1个回答
0
投票

nmemb是数组的成员数

© www.soinside.com 2019 - 2024. All rights reserved.