按位AND和:符号

时间:2019-02-16 09:18:47

标签: 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使用Bitwise运算符,但我似乎不明白它在其中的用法。我已经阅读了一些教程,但是对我来说它们没有多大意义。

我考虑的第二个问题是两个for循环。他们使用:符号,并且只有一个参数?不是应该有三个吗?

3 个答案:

答案 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)

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

答案 1 :(得分:1)

!(n & 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