2013-11-01 173 views
0

我不完全理解按位操作和逻辑操作之间的区别。请参见下面的位运算:布尔逻辑混淆

X = 7和15

据我所知,x将在这种情况下,单独地检查每个位之后等于7。

布尔逻辑如何工作在较低的水平。我相信布尔是一个32位数据类型(我可能是错的)。布尔文字(TRUE和FALSE)是否被视为单个位?

+1

如何在内存中表示'boolean'是一个'implementation detail'。这意味着a)它不适合程序员关心,b)如果MS认为它有意义,它可能会改变。 – igrimpe

+0

@igrimpe,我想了解在布尔逻辑的情况下,整个WORD是否被视为一个单独的位。 – w0051977

+0

如果在VB.Net中将任何数字转换为布尔值,则规则为:如果为0,则结果为false。否则它是真的。如果将布尔转换为int(例如),事情会变得更加复杂。假将给0,但根据使用的转换方法,真可能是1或-1。 VB.Net imho:布尔运算符和按位运算符混淆的最大来源似乎是“相同的”(其他语言有不同的运算符,但VB有相当的“历史”)。 – igrimpe

回答

0

这通常是这些东西的工作原理。

按位操作对表示其操作数的位执行布尔操作。逻辑运算是在布尔集上执行的布尔运算,通常为TRUE和FALSE或1和0.布尔集可以是其中组成员的总计数为2的任意组。在操作数7和15上:如果你使用的系统将它们表示为没有奇怪偏移的直接二进制数,那么7变为二进制0111,15变成二进制1111。二进制7的前导0不是必需的,因为它与将任意十进制数前置0相同:10 = 010 = 000000000000010,但用前导零表示操作更容易。

0111 7 in binary 
1111 15 in binary 
&&&& bitwise AND 
0111 results in 7 

如果truefalse被表示为二进制的1和0,则存在之间的“逻辑” and和“逐位” and操作没有差异。在某些其它数目

1 true as binary 1 
0 false as binary 0 
& either logical or bitwise AND 
0 results in binary 0 

尝试按位and像说1和2

01 1 in binary 
10 2 in binary 
&& bitwise and 
00 results in binary 0 

假设任何数量的除了0将被转换为true,在数字1和2执行“逻辑” and会产生不同的结果

1 the number 1 converted to true and represented as boolean 1 
1 the number 2 converted to true and represented as boolean 1 
& logical and 
1 results in true, here represented as binary 1 

当执行位运算涉及浮点数,负数或基本除了积极的整数以外,任何其他的东西都可以结束,你可能会得到截然不同的结果。这是由于不同的环境使用不同的方法在内存中存储数字。当然,它都是二进制的,但是,数字行并不总是以二进制零为中心,并不总是每一位代表数字的一部分;一些位可能代表数字或指数的符号。如果您想将十进制数字转换为按位运算,则必须深入实现细节。如果您有一种将数字转换为二进制数据的方法,则更容易处理,因为那样您就可以准确地知道数字和它们的顺序,并且可以测试您的期望是否符合您的结果。

1

不要对布尔的内部结构做任何假设。在许多语言(即C,C++)中,bool在内部表示为int,除了值0之外的所有内容都被解释为true。但这是依赖于插入的,可能会在编译器或编译器版本之间发生变化。在像java或c#这样的现代语言中,(上述语句的等价物)甚至不会编译,因为int不能隐式地转换为bool。

如果你确实需要按位运算,那么语句当然是有效的,x的值将是7(因为这是7和15的位数),但要将其转换为布尔值,明智的做法是明确地做,即if (x != 0) then...bool xb = x != 0。这可能有助于避免您的代码读者感到困惑,同时也清楚地表明您知道您现在正在进行类型转换。