如果((row^col)和&;1)==0)继续,该怎么办;在我的C#棋盘应用程序的上下文中是什么意思

如果((row^col)和&;1)==0)继续,该怎么办;在我的C#棋盘应用程序的上下文中是什么意思,c#,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)

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

        }
   }
for(int行=0;行<8;行++)
{
for(int col=0;col<8;col++)
{
如果((行^col)&1)==0)
继续;
BoxView BoxView=新的BoxView
{
Color=Color.FromRgb(0,64,0)
};
矩形rect=新矩形(列*平方大小,
行*平方大小,
平方大小,平方大小);
absoluteLayout.Children.Add(boxView,rect);
}
}

如果
具有相同的奇偶校验,即均为偶数或均为奇数,并且在这种情况下,执行
继续
跳到下一次迭代,则
if
条件的计算结果为真

逐步:

  • row^col
    执行按位异或,当操作数之间的对应位匹配时,将每个结果位设置为
    0

  • &1
    使用最低(最低有效)位进行按位AND运算

  • 最低有效位表示数字的奇偶校验,即偶数为
    0
    ,奇数为
    1


它基本上是通过查找LSB(最低有效位)来检查两个数字是奇数还是偶数

在计算中,最低有效位(LSB)是数据中的位位置 给出单位值的二进制整数,即确定 这个数字是偶数或奇数

细分

(行^col)
按位异或

XOR是唯一的OR。XOR的行为与常规或类似,只是 仅当其中一个或其他数字中有1时才生成1 钻头位置

(x&1)
按位与1

取两个数并产生它们的连词。威尔 仅当其操作的两个值都为1时才生成1

示例

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')} ");

^
&
是按位操作
^
对其操作数的每个位执行异或运算
&
对其操作数的每个位执行AND运算

&1
是a,只取
(行^col)
的最低有效位(LSB)。最低有效位确定数字是奇数还是偶数。如果为0,则该数字为奇数

^
运算符计算
的按位异或,但由于这里有位掩码,我们只关心LSB的异或。我们正在检查LSB的XOR是否为0。好的,只有当
的两个LSB相同时,它才能为0,因此换句话说,我们正在检查
是否都是偶数或都是奇数。


如果
都是偶数或奇数,我们跳到循环的下一次迭代(
继续;
)。因此,我们将只在
中正好有一个为偶数时创建一个新矩形。如果你看棋盘,那就是黑白方块的位置。

好的,我很抱歉,但你能解释一下你说平价是什么意思吗?@DathonWeber。在答案中编辑了更多的细节。不,我理解运算符的逻辑,我对(row^col)与(&1)的组合更感到困惑。我很确定我现在明白了。如果是这样,请考虑接受一个答案:)我认为所有其他方法结合棋盘来解释XOR应该是对未来的访客足够的…事实上,这里也有很好的数学解释(这有点直截了当:
(row^col)&1
的结果与
((row&1)^(col&1)&1
,与
((row%2)^(col%2))&1
,与
(row%2!=col%2)
((row%2)==0&(col%2==1241))相同(col%2==1))
或“奇偶校验不同”的其他变体。好吧,这让我很困惑,什么时候可以跳过迭代。谢谢。@DathonWeber当条件为真时,它
继续
这一事实并不重要。它仍然会创建一个棋盘模式(另一个)如果在它们都是偶数或奇数时创建一个BoxView,并且不执行任何其他操作。”(row^col)逻辑或“???这不是按位异或吗?@CoolBots确实正确,谢谢,不用担心。您的解释、示例和输出看起来不错,但在我看来,分解部分的数学似乎不正确-它也应该是一个异或,然后是结果和1@CoolBots很好的一点,很抱歉,当我写这篇文章时,我正在对生产系统进行调试,我应该这样做最好用实际的例子,而不仅仅是操作的例子
    10011010
XOR 01000110
    -------- =
    11011100
    11011100
AND 00000001
    -------- =
    00000000 
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')} ");
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