-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbinarySearch.c
55 lines (43 loc) · 1.33 KB
/
binarySearch.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
typedef unsigned int u32;
// 定义结构体,包含地址和长度
typedef struct uop_item {
unsigned long addr;
u32 len;
};
// 示例数组
struct uop_item g_item[] = {
{100, 50},
};
// 二分查找函数
int binarySearch(unsigned long addr, u32 len)
{
u32 left = 0, right = sizeof(g_item) / sizeof(g_item[0]);
do {
u32 index = (left + right) >> 1;
struct uop_item *item = &g_item[index];
if (addr >= (item->addr + item->len)) {
left = index + 1;
} else if ((addr + len) <= item->addr) {
right = index;
} else {
return index;
}
} while (left < right);
return -1; // 未找到,返回-1
}
1. 有重叠地址的时候就显示能找到,所以添加的时候可以使用以防止地址叠加
2. 但读写的时候,只有部分重叠地址的也显示能找到,所以拿到item之后还要检查地址是否合法
int main(int argc, char *argv[])
{
// 要查找的地址
int targetAddress = 95;
// 调用二分查找函数
int index = binarySearch(targetAddress, 2);
if (index != -1) {
printf("找到包含地址 %d 的结构体,索引为:%d\n", targetAddress, index);
} else {
printf("没有找到包含地址 %d 的结构体\n", targetAddress);
}
return 0;
}