这可能是非常基本的......但我似乎不明白:
如何
(2 & 1) = 0
(3 & 1) = 1
(4 & 1) = 0
ETC..
上面的这种模式似乎有助于找到偶数
或者
(0 | 1) = 1
(1 | 1) = 1
(2 | 1) = 3
(3 | 1) = 4
(4 | 1) = 5
(5 | 1) = 5
我知道布尔代数在位之间是如何工作的。但我不明白布尔代数如何处理整数(至少在 C# 中)。
提前致谢。
这可能是非常基本的......但我似乎不明白:
如何
(2 & 1) = 0
(3 & 1) = 1
(4 & 1) = 0
ETC..
上面的这种模式似乎有助于找到偶数
或者
(0 | 1) = 1
(1 | 1) = 1
(2 | 1) = 3
(3 | 1) = 4
(4 | 1) = 5
(5 | 1) = 5
我知道布尔代数在位之间是如何工作的。但我不明白布尔代数如何处理整数(至少在 C# 中)。
提前致谢。
它在 C# 中的工作方式与在二进制文件中的工作方式相同。
2 | 1 = 3
和4 | 1 = 5
。
要理解这一点,您需要考虑 1、2、3、4 和 5 的二进制表示:
010 | 001 = 011
和100 | 001 = 101
。
相似地:
010 & 001 = 000
和011 & 001 = 001
您得到第一个结果是因为您and
在两个数字的位串之间执行布尔运算:
2 & 1 => 010 & 001 = 000 = 0
3 & 1 => 011 & 001 = 001 = 1
4 & 1 => 100 & 001 = 000 = 0
5 & 1 => 101 & 001 = 001 = 1
实际上,您正在测试是否设置了“1”位,这仅适用于奇数。
执行or
操作时:
0 | 1 => 000 | 001 = 001 = 1
1 | 1 => 001 | 001 = 001 = 1
2 | 1 => 010 | 001 = 011 = 3
3 | 1 => 011 | 001 = 011 = 3
4 | 1 => 100 | 001 = 101 = 5
5 | 1 => 101 | 001 = 101 = 5
因为在这种情况下,效果or
总是设置1
位,偶数将加一到最接近的更大奇数。
关键是 CPU 并行执行 32 次布尔运算,输入整数的每个位位置一个(当然,假设是 32 位整数)。
它正在对整数进行按位运算。它正在对第一个整数中的每个位与另一个整数中的相应位进行逻辑或/和。然后它返回所有这些操作的结果。例如,4 = 0100 和 1 = 0001,其中的一个逻辑与将按顺序对位进行位并得到 0000(因为 0&0 = 0、1&0 = 0、0&0 = 0 和 0&1 = 0)。对于 or,您将得到 0101(因为 0|0 = 0、1|0 = 1、0|0 = 0 和 0|1 = 1)。诀窍是这些是按位运算,而不是仅对 C# 中的布尔值进行运算的逻辑运算。