我不完全理解按位运算和逻辑运算之间的区别。请看下面的按位运算:
x=7 和 15
我知道在这种情况下,在单独检查每个位后 x 将等于 7。
布尔逻辑如何在较低级别工作。我相信布尔值是 32 位数据类型(我可能是错的)。布尔文字(TRUE 和 FALSE)是否被视为单个位?
我不完全理解按位运算和逻辑运算之间的区别。请看下面的按位运算:
x=7 和 15
我知道在这种情况下,在单独检查每个位后 x 将等于 7。
布尔逻辑如何在较低级别工作。我相信布尔值是 32 位数据类型(我可能是错的)。布尔文字(TRUE 和 FALSE)是否被视为单个位?
不要对布尔值的内部结构做任何假设。在许多语言(即 C、C++)中,bool 内部表示为 int,除值 0 之外的所有内容都被解释为 true。但这是依赖于实现的,并且可能会在编译器甚至编译器版本之间发生变化。在诸如 java 或 c# 之类的现代语言中,(相当于)上述语句甚至不会编译,因为 int 不能隐式转换为 bool。
如果你真的需要按位运算,该语句当然是有效的,x 的值将是 7(因为这是 7 和 15 的按位和),但是要将其转换为布尔值,明确地这样做是明智的,即if (x != 0) then...
或bool xb = x != 0
。这可能有助于避免您的代码阅读者感到困惑,并且还清楚地表明您知道您现在正在进行类型转换。
这通常是这些事情的工作方式。
按位运算对表示其操作数的位执行布尔运算。逻辑运算是对布尔集执行的布尔运算,通常为 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
如果true
和表示为二进制 1 和 0,那么“逻辑”和“按位”操作false
之间没有区别。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
当执行涉及浮点数、负数或基本上除正整数以外的任何内容的按位运算时,您最终可能会得到完全不同的结果。这是由于不同的环境使用不同的方法在内存中存储数字。当然,它都是二进制的,但是数字线并不总是以二进制零为中心,而且每个位都代表数字的一部分并不总是如此。一些位可以表示数字或指数的符号。如果您只想将十进制数折腾到按位运算中,则必须深入研究实现细节。如果您有一种将数字转换为二进制的方法,则处理起来会更容易,因为这样您就可以准确地知道这些位及其顺序,并且您将能够测试您的期望是否与您的结果相符。