C# 这些十六进制值如何返回true?

C# 这些十六进制值如何返回true?,c#,.net,hex,C#,.net,Hex,在从事一个Github项目时,我遇到了一行代码,如下图所示,我对它如何返回真值感到困惑。谢谢 守则: Console.WriteLine0x90&0x10==0x10; 预期结果: 错误的 结果是: 真的 我只是不明白,当比较0x90和0x10看它们是否相同时,它如何返回true。是因为0x90可以被0x10整除吗?这是一个整数。0x90&0x10==0x10,因为所有位0x90和0x10的集合恰好有共同点,恰好与0x10中打开的所有位的集合相同。在这种特殊情况下,只有一个比特 按位and表示

在从事一个Github项目时,我遇到了一行代码,如下图所示,我对它如何返回真值感到困惑。谢谢

守则: Console.WriteLine0x90&0x10==0x10; 预期结果: 错误的 结果是: 真的

我只是不明白,当比较0x90和0x10看它们是否相同时,它如何返回true。是因为0x90可以被0x10整除吗?

这是一个整数。0x90&0x10==0x10,因为所有位0x90和0x10的集合恰好有共同点,恰好与0x10中打开的所有位的集合相同。在这种特殊情况下,只有一个比特

按位and表示给我一个新的数字,其中每个位都是1,当且仅当该位在这两个数字中都是1

所以,当我把一个数字排在另一个右对齐的数字的上方时——请注意,我从左边用零填充,所以它们的宽度相同,然后沿着每一列得到该列的结果:如果顶部的两行中都是1,那么底部的一行中都是1。如果上面的任何一行都是零,那么下面的一行都是零

     10010000    // == 0x90
 &   00010000    // == 0x10
-------------
     00010000    // == 0x10
在写出0和1并按列排列之前,按位操作是非常违反直觉的

下面是另一个示例:0x98&0x18==0x18:

     10011000    // == 0x98
 &   00011000    // == 0x18
-------------
     00011000    // == 0x18
最后一个例子是:

     10001100    // == 0x8C
 &   00011000    // == 0x18
-------------
     00001000    // == 0x10
这是一个好主意。0x90&0x10==0x10,因为所有位0x90和0x10的集合恰好有共同点,恰好与0x10中打开的所有位的集合相同。在这种特殊情况下,只有一个比特

按位and表示给我一个新的数字,其中每个位都是1,当且仅当该位在这两个数字中都是1

所以,当我把一个数字排在另一个右对齐的数字的上方时——请注意,我从左边用零填充,所以它们的宽度相同,然后沿着每一列得到该列的结果:如果顶部的两行中都是1,那么底部的一行中都是1。如果上面的任何一行都是零,那么下面的一行都是零

     10010000    // == 0x90
 &   00010000    // == 0x10
-------------
     00010000    // == 0x10
在写出0和1并按列排列之前,按位操作是非常违反直觉的

下面是另一个示例:0x98&0x18==0x18:

     10011000    // == 0x98
 &   00011000    // == 0x18
-------------
     00011000    // == 0x18
最后一个例子是:

     10001100    // == 0x8C
 &   00011000    // == 0x18
-------------
     00001000    // == 0x10

如果您将它们视为比特:

0x90: 10010000
0x10: 00010000
按位和选择两个数字都有1的列

00010000

也就是0x10

相反,0x90 | 0x10将是0x90,因为它是至少一个数字具有1的列:


如果您想亲自试用,程序员模式下的Windows Calculator应用程序允许您执行按位操作,如果您将它们视为位,则可以轻松地从十六进制转换到二进制:

0x90: 10010000
0x10: 00010000
按位和选择两个数字都有1的列

00010000

也就是0x10

相反,0x90 | 0x10将是0x90,因为它是至少一个数字具有1的列:

如果您想亲自试用,程序员模式下的Windows计算器应用程序可以让您执行位运算,并轻松地从十六进制转换到二进制

0001 0000==0x10

1001 0000==0x90

&

0001 0000==0x10

===============

0x90和0x10等于0x10

所以

0x10==0x10

这是真的

0001 0000==0x10

1001 0000==0x90

&

0001 0000==0x10

===============

0x90和0x10等于0x10

所以

0x10==0x10


这是真的

请你再编辑解释一下好吗?你的意思是字节中的每一位都是非零的吗?但问题是0x90,它肯定与0x10共享一位,因此真正的结果…@SeanMitchell请参阅进一步的更新,这实际上是正确的。对不起@EdPlunkett那么,它返回真是因为一位是相同的?只有一位是真的?我现在明白了!泰姆!请你再编辑解释一下好吗?你的意思是字节中的每一位都是非零的吗?但问题是0x90,它肯定与0x10共享一位,因此真正的结果…@SeanMitchell请参阅进一步的更新,这实际上是正确的。对不起@EdPlunkett那么,它返回真是因为一位是相同的?只有一位是真的?我现在明白了!泰姆!因此,当它到达第一个相同的位时,它将取该位和下面的所有零,然后比较结果?@seanmithell&取两个数字中所有非零的位-在这种情况下,碰巧只有一个,但可能有两个或更多。这是一个与==完全不同的运算。因此,当它到达第一个相同的位时,它将取该位和下面所有的零,然后比较结果?@seanmithell&将取两个数字中所有非零的位-在这种情况下,恰好只有一个,但可能有两个或更多。这是一个与==完全不同的操作。