2011-04-14 83 views
1

我最近有一个测试问题:如何在C#中的两个字节的逻辑&工作?

byte a,b,c; 
a = 190; 
b = 4; 
c = (byte)(a & b); 

什么是c的值?

我从来没有以这种方式使用逻辑操作数,这里发生了什么?通过这个步骤,答案是4,但为什么?

此外,这将在现实世界中出现?我会争辩说,以这种方式使用逻辑操作数和一个演员阵容,只是不好的做法,但我可能是错的。

回答

2

逻辑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”。这是有道理的,因为它对每个位执行逻辑与运算。所以你问题的标题其实是正确的。

+0

谢谢这个测试实际上使用了“逻辑AND”这个词,这个词让我很失望。 – 2011-04-14 14:29:33

+0

这很有趣,我一直都在学习&按位和&&逻辑从我的C++天... – 2011-04-14 14:33:08

+0

@James Michael Hare - C#使用与C++不同的运算符。由于C#具有与数字类型不同的布尔类型,因此根据操作数的类型选择操作。在C#中,&和&&的区别在于&&是操作的短路版本,而&需要评估两个操作数。 – 2011-04-14 14:36:48

4

在这种情况下,您正在执行按位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

+0

只是一个类型,不是第4位,而是第3位。 – digEmAll 2011-04-14 14:21:05

+0

对不起,我应该更清楚,4位,而不是第4位是我的意思。 – 2011-04-14 14:31:39

1

这是按位AND,这意味着在两个字节的位进行比较,并返回1,如果两个位都为1。

10111110 & 
00000100 
-------- 
00000100 
0

一个的逻辑&用途的字节在网络中,称为Binary And Test。基本上,你通过将它们转换成二进制逻辑和字节来实现逻辑和字节。

0

在二进制

4 == 100 190 == 10111110

&是和与运算的布尔运算符,它确实是这样去二元和4以及以字节格式190,所以10111110 AND 100给你100,所以结果是4.

0

这是一个按位AND,而不是逻辑AND。逻辑AND是对条件的测试,即:

if(a && b) doSomething(); 

按位AND查看两个变量的二进制值并将它们组合。例如:

10101010 & 
00001000 
--------- 
00001000 
0

这行了两个数字的二进制,如下所示:

10111110 
00000100 
-------- 
00000100 

在每一列,它会检查,看是否这两个数字是1,如果是,它会返回1在底部。否则,它将在底部返回0。

0

我会争辩说,以这种方式使用逻辑操作数,与一个强制转换,只是不好的做法,但我可能是错的。

没有演员。 &在整数上定义,并且打算以这种方式使用。大家都知道,根据MSDN,这在技术上是合乎逻辑的运算符,我觉得这很疯狂。