Vb.net 布尔逻辑混乱

Vb.net 布尔逻辑混乱,vb.net,boolean-logic,Vb.net,Boolean Logic,我不完全理解位运算和逻辑运算之间的区别。请参见下面的按位操作: x=7和15 我理解,在单独检查每个位后,在这种情况下x将等于7 布尔逻辑如何在较低级别上工作。我认为布尔值是32位数据类型(我可能错了)。布尔文本(真和假)是否被视为单个位?不要对布尔文本的内部结构作任何假设。在许多语言(如C、C++)中,bool在内部表示为int,除值0外的所有内容都解释为true。但这取决于输入,可能会在编译器之间甚至编译器版本之间发生变化。在java或c#等现代语言中,(相当于)上述语句甚至不会编译,因为i

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

x=7和15

我理解,在单独检查每个位后,在这种情况下x将等于7


布尔逻辑如何在较低级别上工作。我认为布尔值是32位数据类型(我可能错了)。布尔文本(真和假)是否被视为单个位?

不要对布尔文本的内部结构作任何假设。在许多语言(如C、C++)中,bool在内部表示为int,除值0外的所有内容都解释为true。但这取决于输入,可能会在编译器之间甚至编译器版本之间发生变化。在java或c#等现代语言中,(相当于)上述语句甚至不会编译,因为int不能隐式转换为bool


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

这些东西通常就是这样工作的

逐位运算对表示其操作数的位执行布尔运算。逻辑运算是对布尔集执行的布尔运算,通常为TRUE和FALSE或1和0。布尔集合可以是集合成员总数为2的任何一组不同项

在对操作数7和15执行按位AND的情况下:如果使用的系统将它们表示为没有奇怪偏移量的直二进制数,则7在二进制中变为0111,15在二进制中变为1111。二进制7上的前导0是不必要的,因为它与在任何十进制数前加零相同:10=010=0000000000000 10,但用前导零更容易说明操作

0111   7 in binary
1111  15 in binary
&&&&  bitwise AND
0111  results in 7
如果
true
false
表示为二进制1和0,则“逻辑”
与“按位”
操作之间没有区别

1   true as binary 1
0   false as binary 0
&   either logical or bitwise AND
0   results in binary 0
对其他一些数字(如1和2)尝试按位

01 1 in binary
10 2 in binary
&& bitwise and
00 results in binary 0
假设除0之外的任何数字都将转换为
true
,对数字1和2执行“逻辑”和
,将产生不同的结果

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

当执行涉及浮点数、负数或基本上除正整数以外的任何内容的位运算时,可能会得到完全不同的结果。这是因为不同的环境使用不同的方法在内存中存储数字。当然,它都是二进制的,但数字线并不总是以二进制零为中心,也不总是每一位都代表数字的一部分;有些位可以表示数字或指数的符号。如果您只想将十进制数转换为按位操作,则必须深入了解实现细节。如果您有一种将数字转换为二进制的方法,那么处理起来就更容易了,因为这样您就可以准确地知道位及其顺序,并且可以测试您的期望是否与您的结果相符。

如何在内存中表示
布尔值是
实现细节
。这意味着a)程序员不必关心,b)如果MS认为它有意义,它可能会改变。@igrimpe,我试图理解在布尔逻辑的情况下,整个单词是否被视为一个位。如果在VB.Net中将任何数字转换为布尔值,规则是:如果是0,则结果为假。否则这是真的。如果将布尔值转换为int(例如),事情会变得更复杂。false将给出0,但true可能是1或-1,具体取决于所使用的转换方法。VB.Net imho中最大的混淆源:布尔运算符和位运算符似乎“相同”(其他语言有不同的运算符,但VB有相当多的“历史”)。