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
0x00000001是1二进制的,虽然它是用十六进制(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,则该数字是奇数.那是否足够解释?
rlb*_*ond 13
当我们查看基数为10的数字时,很容易判断一个数字是否可以被10整除:它在最后一个位置有一个0.上面的代码也会查看最后一个位置的数字,但是在基数2中.如果它不为零,则该数字不能被2整除.
Boo*_*jum 10
它掩盖了最后一点.如果你看一个数字(...,256,128,64,32,16,8,4,2和1)的二进制表示中的每个地方,你会注意到只有一个地方是奇数.无论位是置位还是清零(零均为偶数),所有其余位置都具有偶数值.添加偶数将始终给出偶数.只有最后一个位置才能确定数字的奇偶校验.这i & &0x00000001部分只是隔离了最后一个地方.