if (((row ^ col) & 1) == 0) continue; 在我的 C# Chessboard 应用程序上下文中的意思

Dat*_*ber -2 c#

所以我正在研究一个移动开发课程的编码问题,这部分代码让我很困惑。它应该在移动设备上制作棋盘,但扔给我的部分是 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)

AAA*_*ddd 5

它基本上是通过查看 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)