按位AND with if语句 我可以使用C++中的按位和C++代码。该方法基于按位运算的结果返回布尔值 bool SetValue( myType a ) { if( a & notMyType == notMyType ) { return false; } if( a & newMyType == newMyType ) { SendNew(a); return true; } if( a & oldMyType == oldMyType ) { SendOld(a); return true; } }

按位AND with if语句 我可以使用C++中的按位和C++代码。该方法基于按位运算的结果返回布尔值 bool SetValue( myType a ) { if( a & notMyType == notMyType ) { return false; } if( a & newMyType == newMyType ) { SendNew(a); return true; } if( a & oldMyType == oldMyType ) { SendOld(a); return true; } },c++,C++,简短回答:否 通常,对任何非基元类型的对象使用逐位操作被认为是一个坏主意(我看不出这到底能实现什么)。此外,我很少看到在非自然数的情况下,按位运算被证明是有用的。==的优先级高于&您应该使用parens: a & notMyType == notMyType 被评估为 a & (notMyType == notMyType) 因此,您应该使用: (a & notMyType) == notMyType 实际上,您正在使用按位AND运算符(&),但您可能希望使用逻辑A

简短回答:


通常,对任何非基元类型的对象使用逐位操作被认为是一个坏主意(我看不出这到底能实现什么)。此外,我很少看到在非自然数的情况下,按位运算被证明是有用的。

==
的优先级高于
&
您应该使用parens:

a & notMyType == notMyType
被评估为

a & (notMyType == notMyType)
因此,您应该使用:

(a & notMyType) == notMyType

实际上,您正在使用按位AND运算符(
&
),但您可能希望使用逻辑AND运算符(
&&
)。

是的,可能需要一些假设和修复

假设:

  • MyType
    是一个整数类型
  • 这些常量通常是位值(1、2、4,…)或其语义上的自然组合
上一次比较看起来像是输入错误(使用一个标志进行选择,然后与另一个标志进行比较)。这在某些值组合中仍然有效,但充其量也会令人费解

您还需要修复运算符优先级

a & flag == flag
真的意味着

a & (flag == flag)
也就是说,假设这都是积分,而不是外部过载

a & 1
也就是说

(a & 1) == 1
这不是你想要的。要么加括号,要么简单地写

a & flag

依赖于当且仅当
a
具有标志
flag
时,这将强制转换为
true
。此条件看起来不像布尔值,但是C++提供了一个隐式转换到布尔值。零值转换为
false
,任何其他值转换为
true

您究竟想实现什么?为了可读性,您应该使用
if((a&b)==b)
而不是
if(a&b==b)
@ThiefMaster:这两个结构并不意味着相同的事情。第二个被解析为
(a&(b==b))
。顺便问一下,“myType”是什么类型的?它是整数类型定义吗?如果涉及的值是整数,典型的习惯用法是不进行比较:
If(a¬MyType)
你怎么知道
myType
不是一个原语的
typedef
,或者是一个定义了
运算符&
的类型?我指出,如果myType是一个自然数,那么它可能会很有用。很抱歉对它进行了错误编辑。我还有一个问题-如果我不使用相等运算符,代码如何区分notMyType、newMyType和oldMyType?谢谢。编辑的答案涵盖了这一点。我建议您在问题中添加您类型的声明,以及您可以提供的任何其他子问题或澄清,如果您希望重新打开它。