【问题标题】:Boolean logic confusion布尔逻辑混淆
【发布时间】:2013-11-01 09:52:03
【问题描述】:

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

x=7 和 15

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

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

【问题讨论】:

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

标签: vb.net boolean-logic


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这通常是这些事情的工作方式。

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

    在对操作数 7 和 15 执行按位与的情况下:如果您使用的系统将它们表示为没有奇怪偏移的直接二进制数,则 7 变为二进制的 0111,15 变为二进制的 1111。二进制 7 上的前导 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
    

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

    【讨论】:

      猜你喜欢
      • 2016-08-14
      • 1970-01-01
      • 2019-04-14
      • 2011-09-19
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      相关资源
      最近更新 更多