所以我正在研究一个移动开发课程的编码问题,这部分代码让我很困惑。它应该在移动设备上制作棋盘,但扔给我的部分是 if (((row ^ col) & 1) == 0) continue; 我不明白这个部分是做什么的。
for (int row = 0; row < 8; row++)
{
for (int col = 0; col < 8; col++)
{
if (((row ^ col) & 1) == 0)
continue;
BoxView boxView = new BoxView
{
Color = Color.FromRgb(0, 64, 0)
};
Rectangle rect = new Rectangle(col * squareSize,
row * squareSize,
squareSize, squareSize);
absoluteLayout.Children.Add(boxView, rect);
}
}
Run Code Online (Sandbox Code Playgroud)
它基本上是通过查看 LSB(最低有效位)来检查两个数字是奇数还是偶数
在计算中,最低有效位 (LSB) 是二进制整数中给出单位值的位位置,即确定数字是偶数还是奇数。
10011010
^ least significant bit
Run Code Online (Sandbox Code Playgroud)
分解
(row ^ col) 按位异或。
XOR 是异或。XOR 的行为与常规 OR 类似,但它只会在一个或其他数字在该位位置为 1 时才产生 1。
10011010
XOR 01000110
-------- =
11011100
Run Code Online (Sandbox Code Playgroud)
(x & 1) 按位 AND 与 1
AND 取两个数字并产生它们的合取。如果 AND 操作的两个值也是 1,则只会产生 1。
11011100
AND 00000001
-------- =
00000000
Run Code Online (Sandbox Code Playgroud)
例子
for (int row = 0; row < 8; row++)
for (int col = 0; col < 8; col++)
if (((row ^ col) & 1) == 0)
Console.WriteLine($"{row} {col} : {Convert.ToString(row, 2).PadLeft(8,'0')} {Convert.ToString(col, 2).PadLeft(8,'0')} ");
Run Code Online (Sandbox Code Playgroud)
输出
0 0 : 00000000 00000000
0 2 : 00000000 00000010
0 4 : 00000000 00000100
0 6 : 00000000 00000110
1 1 : 00000001 00000001
1 3 : 00000001 00000011
1 5 : 00000001 00000101
1 7 : 00000001 00000111
2 0 : 00000010 00000000
2 2 : 00000010 00000010
2 4 : 00000010 00000100
2 6 : 00000010 00000110
3 1 : 00000011 00000001
3 3 : 00000011 00000011
3 5 : 00000011 00000101
3 7 : 00000011 00000111
4 0 : 00000100 00000000
4 2 : 00000100 00000010
4 4 : 00000100 00000100
4 6 : 00000100 00000110
5 1 : 00000101 00000001
5 3 : 00000101 00000011
5 5 : 00000101 00000101
5 7 : 00000101 00000111
6 0 : 00000110 00000000
6 2 : 00000110 00000010
6 4 : 00000110 00000100
6 6 : 00000110 00000110
7 1 : 00000111 00000001
7 3 : 00000111 00000011
7 5 : 00000111 00000101
7 7 : 00000111 00000111
Run Code Online (Sandbox Code Playgroud)