![](/img/trans.png)
[英]What does the following mean in context of programming, specifically C programming language?
[英]what does ADDR macro mean in c programming language
我在某些编码器的代码中多次遇到以下行。 欣赏是否有人可以告诉我此Macro的含义?
#define ADDR(x, y) (((x) + (y)) | ((x) != (y)))
下面是包含此宏的来自Internet的代码的示例。 它看起来像某种平衡树的实现,声称具有解决O(logn)中固定数组的任意子间隔中第k个元素的随机查询问题的能力。
看起来ADDR宏正在计算间隔的一些索引。
这是某种技巧吗? 在与树相关的其他问题的代码中,我也看到了此宏。
#include <bits/stdc++.h>
const int maxn = 2e5 + 10;
const int maxm = 2e6 + 10;
#define AVG(x, y) (((x) + (y)) >> 1)
#define ADDR(x, y) (((x) + (y)) | ((x) != (y)))
using namespace std;
struct SegTree {
int id, val;
} st[maxm], ss[maxn];
int lnum[maxm], lt[maxn], rt[maxn], tot;
bool cmp(const SegTree& a, const SegTree& b) { return a.val < b.val; }
void build(int l, int r, int start) {
int mid = AVG(l, r), p = ADDR(l, r), i, j, k = start, sum = 0;
if (l == r) {
st[start] = ss[l];
return;
}
lt[p] = tot;
rt[p] = tot + mid - l + 1;
tot += r - l + 1;
build(l, mid, lt[p]);
build(mid + 1, r, rt[p]);
i = lt[p];
j = rt[p];
while (i <= lt[p] + mid - l && j < rt[p] + r - mid) {
if (st[i].id < st[j].id) {
st[k] = st[i++];
lnum[k++] = ++sum;
} else {
st[k] = st[j++];
lnum[k++] = sum;
}
}
while (i <= lt[p] + mid - l) {
st[k] = st[i++];
lnum[k++] = ++sum;
}
while (j < rt[p] + r - mid) {
st[k] = st[j++];
lnum[k++] = sum;
}
}
int query(int l, int r, int ls, int rs, int k, int start) {
int mid = AVG(l, r), p = ADDR(l, r);
int i = ls > 0 ? lnum[start + ls - 1] : 0, j = lnum[start + rs];
if (l == r) return st[start].val;
if (j - i >= k) return query(l, mid, i, j - 1, k, lt[p]);
return query(mid + 1, r, ls - i, rs - j, k - j + i, rt[p]);
}
'|' 表示“按位或”和“!=“,“不等于”。 因此,您的宏将x和y相加,如果它们不相等,则将总和的最低位设置为1,否则将其设置为0。
总和1和3。
(1) 0001
(3) 0011
--> (4) 0100
评估!=
。
(1) 0001
(3) 0011
--> (1) 0001
'|' 结果。
(4) 0100
(1) 0001
--> (5) 0101
因此,在此示例中,表达式返回5。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.