首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解c++中的“位-和(&)”和“一元补语(~)”

理解c++中的“位-和(&)”和“一元补语(~)”
EN

Stack Overflow用户
提问于 2015-12-04 19:33:50
回答 2查看 215关注 0票数 3

当在此代码段中使用Bitwise-AndUnary Complement时,我会遇到一些问题。

代码语言:javascript
复制
if((oldByte==m_DLE) & (newByte==m_STX)) {
    int data_index=0;

   //This below line --- does it returns true if both the oldByte and newByte are not true 
   //and within timeout 
while((timeout.read_s()<m_timeout) & ~((oldByte==m_DLE) & (newByte==m_ETX))) { 

                        if(Serial.available()>0) {
                            oldByte=newByte;
                            newByte=Serial.read();

                            if(newByte==m_DLE) {
                            .
                            .
                            .

两个操作符& ~是否都在执行逻辑上的非操作,比如检查,直到oldBytenewByte都是假的。

以上代码来自于代码的链接 ->第227行。

我试图用C语言实现我的应用程序的代码,但没有计时函数。

代码语言:javascript
复制
 if((oldByte==DLE) && (newByte== STX)) {
    data_index = 0;
     // is this the correct implematation for above C++ code to C  
    while(! ((oldByte== DLE) && (newByte== ETX))){
          oldByte = newByte;

这个方法在C中实现正确吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-04 19:48:04

代码语言:javascript
复制
(timeout.read_s()<m_timeout) & ~((oldByte==m_DLE) & (newByte==m_ETX))

相当于(但可能不如)

代码语言:javascript
复制
(timeout.read_s()<m_timeout) && !(oldByte==m_DLE && newByte==m_ETX)

它相当于(而IMO的可读性低于)。

代码语言:javascript
复制
(timeout.read_s()<m_timeout) && (oldByte!=m_DLE || newByte!=m_ETX)

编辑:应该添加一个关于短路的警告。虽然特定的示例语句都将返回相同的值,但使用&或\将跳过不会影响结果的计算片段。这在您的具体示例中并不重要,但在这样的示例中可能非常重要:

代码语言:javascript
复制
(oldByte!=nullptr & *oldByte == m_ETX) // will crash when oldByte=nullptr.

(oldByte!=nullptr && *oldByte == m_ETX) // will evaluate to false when oldByte=nullptr.
票数 5
EN

Stack Overflow用户

发布于 2015-12-04 19:37:43

由于相等运算符(==)的结果是0或1,所以您也可以按位使用。(foo==1) & ~(bar==1)也能工作,因为AND (foo==1)总是导致1和0,它掩盖了~(bar==1)中的所有其他位。但是,强烈建议使用逻辑对应物&、\和!。

下列情况将不象预期的那样起作用:

代码语言:javascript
复制
if (~(bar == 1) & ~(foo == 1))

例如,如果foo = bar = 1,那么它将在ia32上计算为0 0xfffffffe,这与0不同,因此"TRUE“

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34096090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档