我已经进行了将近两个月的编码,而我才刚刚开始精通该语言的基础知识。最近,我偶然发现了一段看起来像这样的代码:
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使用Bitwise运算符,但我似乎不明白它在其中的用法。我已经阅读了一些教程,但是对我来说它们没有多大意义。
我考虑的第二个问题是两个for循环。他们使用:符号,并且只有一个参数?不是应该有三个吗?
答案 0 :(得分:1)
对于按位AND,它正在检查n是否为偶数。它的工作方式如下:如果n中的最后一位为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://docs.microsoft.com/en-us/cpp/cpp/bitwise-and-operator-amp?view=vs-2017
用于范围操作
for (int e : a)
是
答案 1 :(得分:1)
将它们布置为位域,例如:
101010101
& 000000001
---------
result 000000001
非零结果值将在布尔值 true或false 中提升为true
。仅将结果0
提升为false
。 !
( not )反转结果,因此true
变成false
,反之亦然。
第二个问题是关于range-based for loop:
for (auto e : f) {
(自C ++ 11起)它是以下语言的简化版本:
for(auto it=std::begin(f); it!=std::end(f); ++it) {
auto e = *it;
答案 2 :(得分:0)
如果n为偶数,则将其转换为二进制将得到类似1010的结果,最低有效位始终为0。 如果&0和1,则得到0。第一个if循环是检查n是否为偶数。
对于按位运算- 1.将数字转换为二进制。 2.对单个位执行操作。 例如3&6 = 011&110 = 010 = 2