如何使用位运算符实现逻辑运算符
How to implement logical operators using bitwise operators
如何仅使用位运算符&
、^
、|
、[=15=来实现逻辑运算符||
和&&
], >>
, <<
逻辑运算符 !
, 和 +
?我在堆栈溢出和 google 上四处寻找某人以前的答案或一些程序集实现,但还没有找到任何东西。我想如果没有人有任何解决方案,我可能会求助于 HDL,看看它合成了什么。
他们不可能,尽管建议 a && b
可以写成 !!a & !!b
并且 a || b
可以写成 !!a | !!b
.
这是因为 ||
和 &&
有一个 属性 如果表达式的结果从第一个的结果已知,则第二个参数的计算不会发生争论。例如。对于 true || A
,A
不计算,对于 false && B
,B
不计算。因此,如果您尝试使用按位运算符复制 ||
或 &&
,那么您很可能会在程序中引入副作用。
另外 ||
和 &&
是 序列点 ,而按位运算符不是。例如,a++ && a++
已定义,但 a++ & a++
未定义。
如何仅使用位运算符&
、^
、|
、[=15=来实现逻辑运算符||
和&&
], >>
, <<
逻辑运算符 !
, 和 +
?我在堆栈溢出和 google 上四处寻找某人以前的答案或一些程序集实现,但还没有找到任何东西。我想如果没有人有任何解决方案,我可能会求助于 HDL,看看它合成了什么。
他们不可能,尽管建议 a && b
可以写成 !!a & !!b
并且 a || b
可以写成 !!a | !!b
.
这是因为 ||
和 &&
有一个 属性 如果表达式的结果从第一个的结果已知,则第二个参数的计算不会发生争论。例如。对于 true || A
,A
不计算,对于 false && B
,B
不计算。因此,如果您尝试使用按位运算符复制 ||
或 &&
,那么您很可能会在程序中引入副作用。
另外 ||
和 &&
是 序列点 ,而按位运算符不是。例如,a++ && a++
已定义,但 a++ & a++
未定义。