这为什么有效?(在c ++中找到奇数)

Tom*_*Tom 6 c++ bitmask

for (unsigned int i = 1; i <= 100; i++) {
    if (i & 0x00000001) {
        std::cout << i<<",";
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么(以及如何):if( i & 0x00000001 )找出奇数?

sys*_*USE 22

0x000000011二进制的,虽然它是用十六进制(base-16)表示法编写的.那是0x一部分.

& 是逐位'AND'运算符,用于执行二进制数字(位)操作.

i & 1 将i的所有二进制数字转换为零,最后一个除外.

将得到的1位数转换为布尔值是很简单的,以便通过if语句进行评估.

下图显示了i的最后16位二进制数字,以及它们发生了什么.

i:   i in binary:        i & 1 in binary:    convert to boolean
---- ------------------- ------------------- ---------------------
1    0000000000000001    0000000000000001    true
2    0000000000000010    0000000000000000    false
3    0000000000000011    0000000000000001    true
4    0000000000000100    0000000000000000    false
5    0000000000000101    0000000000000001    true
6    0000000000000110    0000000000000000    false
7    0000000000000111    0000000000000001    true
8    0000000000001000    0000000000000000    false
...  ...                 ...                 ...
99   0000000001100011    0000000000000001    true
100  0000000001100100    0000000000000000    false
Run Code Online (Sandbox Code Playgroud)


Fre*_*son 21

它使用按位"和"运算符来屏蔽除最后一位之外的所有内容.如果最后一位是1,则该数字是奇数.那是否足够解释?

  • (到原始海报)如果您不理解这个答案,这是正确的,尝试将5个偶数和5个奇数更改为二进制.观察最后一位发生的事情以及它与您转换的数字的关系.(更具体地说,看一下当数字是偶数时和数字是奇数时会发生什么).按位读取AND (6认同)
  • +1,我个人也很想听到使用sesquipedalian表示而不是`1`的一些解释;-) (4认同)

rlb*_*ond 13

当我们查看基数为10的数字时,很容易判断一个数字是否可以被10整除:它在最后一个位置有一个0.上面的代码也会查看最后一个位置的数字,但是在基数2中.如果它不为零,则该数字不能被2整除.


Boo*_*jum 10

它掩盖了最后一点.如果你看一个数字(...,256,128,64,32,16,8,4,2和1)的二进制表示中的每个地方,你会注意到只有一个地方是奇数.无论位是置位还是清零(零均为偶数),所有其余位置都具有偶数值.添加偶数将始终给出偶数.只有最后一个位置才能确定数字的奇偶校验.这i & &0x00000001部分只是隔离了最后一个地方.