我不完全理解按位操作和逻辑操作之间的区别。请参阅下面的按位操作:
x = 7和15
我知道在这种情况下,在单独检查每个位之后,x将等于7。
布尔逻辑如何在较低级别工作。我相信布尔值是32位数据类型(我可能错了)。布尔文字(TRUE和FALSE)是否被视为单个位?
答案 0 :(得分:1)
不要对布尔的内部结构做任何假设。在许多语言(即C,C ++)中,bool在内部表示为int,除了值0之外的所有内容都被解释为true。但这是依赖于impmentation的,可能会在编译器甚至编译器版本之间发生变化。在java或c#等现代语言中,(相当于)上述语句甚至不会编译,因为int不能隐式地转换为bool。
如果你真的需要按位运算,那么语句当然是有效的,x的值将是7(因为这是按位而且是7和15),但要将其转换为布尔值,那么这样做是明智的明确地说,即if (x != 0) then...
或bool xb = x != 0
。这可能有助于避免对代码的读者造成混淆,并且清楚地表明您已经意识到您正在进行类型转换。
答案 1 :(得分:0)
这通常是这些事情的运作方式。
按位运算对表示其操作数的位执行布尔运算。逻辑运算是对布尔集执行的布尔运算,通常为TRUE和FALSE或1和0.布尔集可以是任何一组不同的项,其中集成员的总数为2。
在操作数7和15上执行按位AND的情况下:如果您使用的系统将它们表示为没有奇怪偏移的直接二进制数,则7将变为二进制的0111,15变为1111的二进制。二进制7上的前导0不是必需的,因为它与将0添加到任何十进制数相同:10 = 010 = 000000000000010,但更容易用前导零来说明操作。
0111 7 in binary
1111 15 in binary
&&&& bitwise AND
0111 results in 7
如果true
和false
表示为二进制1和0,那么“逻辑”and
和“按位”and
操作之间没有区别。< / p>
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
当执行涉及浮点数,负数或基本上除正整数之外的任何位运算时,最终可能会得到截然不同的结果。这是由于使用不同方法在内存中存储数字的不同环境。当然,它都是二进制的,但是,数字行并不总是以二进制零为中心,并不总是每个位代表数字的一部分;一些比特可以代表数字或指数的符号。如果您只想将十进制数字投入按位运算,则必须深入了解实现细节。如果您有将数字转换为二进制的方法,那么处理起来会更容易,因为您可以准确地知道这些位及其顺序,并且您将能够测试您的期望是否与您的结果相符。