c++ - 按位与和 : symbol

标签 c++ bit-manipulation

我已经编码近两个月了,我才刚刚开始“流利”地掌握这门语言的基础知识。最近,我偶然发现了一段看起来像这样的代码:

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)

https://en.cppreference.com/w/cpp/language/range-for

关于c++ - 按位与和 : symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721598/

相关文章:

c++ - 在 Linux 上分析数据库密集型代码

c - C中的按位符号除法算法

javascript - 在 JavaScript 中获取最低有效位

c++ - LNK2001 即使已定义

c++ - 如何在 C++ 中创建锯齿状的字符串数组?

c++ - 带有 GLSL 的 OpenGL 中的简单二维矩阵旋转不产生任何输出

c++ - Boost 安装 - 从源代码简化构建

java - 为什么位或操作会导致符号扩展而位却不会?

c++ - 是否可以删除此条件语句?

c++ - 交换一个字节中的两个半字节