我最近有一个测试问题:如何在C#中的两个字节的逻辑&工作?
byte a,b,c;
a = 190;
b = 4;
c = (byte)(a & b);
什么是c的值?
我从来没有以这种方式使用逻辑操作数,这里发生了什么?通过这个步骤,答案是4,但为什么?
此外,这将在现实世界中出现?我会争辩说,以这种方式使用逻辑操作数和一个演员阵容,只是不好的做法,但我可能是错的。
我最近有一个测试问题:如何在C#中的两个字节的逻辑&工作?
byte a,b,c;
a = 190;
b = 4;
c = (byte)(a & b);
什么是c的值?
我从来没有以这种方式使用逻辑操作数,这里发生了什么?通过这个步骤,答案是4,但为什么?
此外,这将在现实世界中出现?我会争辩说,以这种方式使用逻辑操作数和一个演员阵容,只是不好的做法,但我可能是错的。
逻辑AND运算符应用于整数时,会执行按位AND运算。在两个操作数中出现1的每个位置的结果都是1。
0011
& 0101
------
0001
十进制值190等价于二进制10111110.十进制4是二进制00000100
执行逻辑与操作在这样的位:
10111110
& 00000100
----------
00000100
所以结果是4 。
此外,这会在现实世界中出现?我会争辩说,以这种方式使用逻辑操作数和一个演员阵容,只是不好的做法,但我可能是错的。
这些操作在多种情况下很有用。最常见的是当使用枚举值作为标志。
[Flags]
public enum MyFileOptions
{
None = 0,
Read = 1, // 2^0
Write = 2, // 2^1
Append = 4, // 2^2
}
如果Enum的值是2的幂,那么它们可以合并成一个整数变量(使用逻辑OR运算符)。
MyFileOptions openReadWrite = MyFileOptions.Read | MyFileOptions.Write;
在这个变量中,两个位都被设置,所以它表示选择了读和写选项。
逻辑AND运算符可用于测试值。
bool openForWriting = ((openReadWrite & MyFileOptions.Write) == MyFileOptions.Write);
注意
很多人都指出,这实际上是一个位,而不是一个逻辑与。在我发布之前,我在规范中对它进行了查看,我很惊讶地发现在规范中两个版本都被称为“逻辑AND”。这是有道理的,因为它对每个位执行逻辑与运算。所以你问题的标题其实是正确的。
在这种情况下,您正在执行按位AND操作,而不是逻辑AND,它将& b的两个值的位组合在一起,并给出仅设置了两个位的结果,这两个值都设置在& b,在这种情况下,只有4位的位。
190 = 10111110
& 4 = 00000100
-------------------
= 4 00000100
编辑:有趣的是,MSDN本身就是是否把它称为逻辑VS按位有点泥泞的问题。在他们对逻辑运算符(& | || etc)的描述中,他们说逻辑运算符(bitwise和bool),但是在&本身的描述中,它表示它对整数执行按位AND和对bools执行逻辑AND。看起来它仍然被认为是一个逻辑运算符,但整数类型之间的操作是按位与。
http://msdn.microsoft.com/en-us/library/sbf85k1c(v=vs.71).aspx
只是一个类型,不是第4位,而是第3位。 – digEmAll 2011-04-14 14:21:05
对不起,我应该更清楚,4位,而不是第4位是我的意思。 – 2011-04-14 14:31:39
这是按位AND
,这意味着在两个字节的位进行比较,并返回1,如果两个位都为1。
10111110 &
00000100
--------
00000100
一个的逻辑&用途的字节在网络中,称为Binary And Test。基本上,你通过将它们转换成二进制逻辑和字节来实现逻辑和字节。
在二进制
4 == 100 190 == 10111110
&是和与运算的布尔运算符,它确实是这样去二元和4以及以字节格式190,所以10111110 AND 100给你100,所以结果是4.
这是一个按位AND,而不是逻辑AND。逻辑AND是对条件的测试,即:
if(a && b) doSomething();
按位AND查看两个变量的二进制值并将它们组合。例如:
10101010 &
00001000
---------
00001000
这行了两个数字的二进制,如下所示:
10111110
00000100
--------
00000100
在每一列,它会检查,看是否这两个数字是1,如果是,它会返回1在底部。否则,它将在底部返回0。
我会争辩说,以这种方式使用逻辑操作数,与一个强制转换,只是不好的做法,但我可能是错的。
没有演员。 &
在整数上定义,并且打算以这种方式使用。大家都知道,根据MSDN,这在技术上是合乎逻辑的运算符,我觉得这很疯狂。
谢谢这个测试实际上使用了“逻辑AND”这个词,这个词让我很失望。 – 2011-04-14 14:29:33
这很有趣,我一直都在学习&按位和&&逻辑从我的C++天... – 2011-04-14 14:33:08
@James Michael Hare - C#使用与C++不同的运算符。由于C#具有与数字类型不同的布尔类型,因此根据操作数的类型选择操作。在C#中,&和&&的区别在于&&是操作的短路版本,而&需要评估两个操作数。 – 2011-04-14 14:36:48