我已经编码近两个月了,我才刚刚开始“流利”地掌握这门语言的基础知识。最近,我偶然发现了一段看起来像这样的代码:
if (! (n & 1)) {
median += a[n / 2 - 1];
median /= 2;
}
map<int, int> f;
for (int e : a) {
f[e]++;
}
int mode = 0;
for (auto e : f) {
if (e.second > f[mode]) {
mode = e.first;
}
}
我知道第一个 if 使用按位运算符,但我似乎无法理解它在那里是如何使用的。我已经阅读了一些教程,但它们对我来说意义不大。
我的第二个问题是关于两个 for 循环的。他们使用 : 符号并且只有一个参数?不是应该有三个吗?
最佳答案
对于按位与,它正在检查 n 是否为偶数。它以下列方式工作:如果 n 中的最后一位是 1(每个奇数都是 1),则 n & 1 的结果将为 1,否则将为 0。因为任何 != 0 都被评估为 true在 C++ 中,它正在反转此检查。由于整个表达式被“!”翻转当 n 为奇数时,它将评估为 false;当 n 为偶数时,它将评估为 true。
举个例子,让 n=3、n=4、n=5 并用二进制表示它们:
n=3:
0101 & 0001 = 0001
n=4:
1000 & 0001 = 0000
n=5:
1001 & 0001 = 0001
https://learn.microsoft.com/en-us/cpp/cpp/bitwise-and-operator-amp?view=vs-2017
对于范围操作
for (int e : a)
是
关于c++ - 按位与和 : symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721598/