首页 / 知识
在C ++中对布尔值使用按位运算符
2023-04-13 00:39:00

Using bitwise operators for Booleans in C++有什么理由不对C ++中的"布尔"值使用按位运算符&,|和^? 有时,我遇到两种情况之一,即我想完全满足两个条件之一(XOR),因此我只是将^运算符放入条件表达式中。 有时我还希望评估条件的所有部分,无论结果是否正确(而不是短路),因此我使用&和|。 有时我还需要累积布尔值,并且&=和| =可能非常有用。 在执行此操作时,我有些挑剔,但是代码仍然比其他方法有意义且更简洁。 有没有理由不将其用于布尔? 是否有任何现代编译器为此带来不好的结果?
但是,在C ++中,保证 两个主要原因。简而言之,请仔细考虑。这样做可能有充分的理由,但是如果您的注释中有非常明确的内容,因为它可能很脆弱,而且就像您自己说的那样,人们通常不习惯看到这样的代码。 按位异或!=逻辑异或(0和1除外)
首先,如果要对
感谢用户@Patrick首次表达了这一点。 操作顺序
其次, 换一种说法
不会总是得到与以下结果相同的结果(或最终状态)
这一点特别重要,因为您可能无法控制方法 我认为
是你想要的
扬起的眉毛应该告诉你足以停止这样做。您无需为编译器编写代码,而是先为其他程序员编写代码,然后再为编译器编写代码。即使编译器正常工作,也不会让其他人感到惊讶-按位运算符是针对位操作而不是布尔值。 位级运算符的缺点。 你问:
是的,逻辑运算符(即内置的高级布尔运算符
简而言之,高级运算符的每个此类优点都是位级运算符的缺点。
特别是,由于按位运算符缺少将参数转换为0/1的结果,因此例如 如何在C ++中表达逻辑或。 然后,您为问题提供了一些背景知识,
好吧,按位运算符的优先级高于逻辑运算符。这尤其意味着在诸如
您会得到可能意外的结果 而是只写
更简洁地表达您的意思。
对于多参数,要么/或者没有执行该工作的C ++运算符。例如,如果您编写
要表达一般性,或者当
或使用非
使用 您进一步阐述,
好吧,这相当于分别检查是否满足所有条件或任何条件,并且de Morgans法则告诉您如何从一个条件转到另一个条件。即您只需要其中之一。原则上,您可以将 还请考虑:
使用Visual C ++ 11.0和g ++ 4.7.1的输出:
结果不同的原因是位级别
那么,您希望使用
如果是前一个
与Patrick的答案相反,C ++没有用于执行短路异或的
使用 帕特里克(Patrick)提出了要点,我不再重复。但是我可能会建议通过使用命名良好的布尔变量将``if''语句尽可能地简化为可读的英语,例如,这是使用布尔运算符,但您也可以使用按位并适当地命名布尔值:
您可能会认为使用布尔值似乎是不必要的,但这在两个主要方面有帮助:
编辑:您没有明确地说您想要'if'语句的条件(尽管这似乎很有可能),这是我的假设。但是我对中间布尔值的建议仍然存在。 IIRC,许多C ++编译器会在尝试将按位运算的结果强制转换为布尔值时发出警告。您将必须使用类型转换来使编译器满意。 在if表达式中使用按位运算将引起相同的批评,尽管编译器可能不会这样做。任何非零值都将被视为true,因此" if(7&3)"之类的值将为true。这种行为在Perl中是可以接受的,但是C / C ++是非常明确的语言。我认为Spock的眉毛是尽职调查。 :)我将附加" == 0"或"!= 0"以使其完全清楚您的目标是什么。 但是无论如何,这听起来像是个人喜好。我将通过lint或类似工具运行代码,看看它是否还认为这是不明智的策略。就个人而言,它读起来就像是一个编码错误。 对布尔使用按位运算有助于节省处理器不必要的分支预测逻辑,这是由于逻辑运算引入了" cmp"指令所致。 用按位运算(所有操作数均为bool)替换逻辑会生成提供相同结果的更有效代码。理想情况下,效率应超过使用逻辑运算进行订购时可以利用的所有短路优势。 尽管程序员应该以注释的理由来注释它,但是这可能会使代码有点不可读。 |
最新内容
相关内容
Python 条件对象
Python 条件对象,状态,培训,对象,条件,线程,方法,底层,发生,场景,典型,条件对象总是与某种类型的锁对象相关联,锁对象可以通过传入获得,或者在python正则表达式使用
python正则表达式使用,位置,培训,一致,字符串,函数,模式,对象,模块,参数,表达式,正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字python海象运算符的使用
python海象运算符的使用,培训,代码,海象,赋值,操作,可读性,条件下,表达式,意义,以上,python海象运算符的使用1、在判断条件下允许操作。在一pythoncondition条件变量的作用
pythoncondition条件变量的作用,培训,变量,条件,线程,方法,作用,实例,对象,眼睛,以上,1、Python提供的Condition对象支持复杂的线程同步。2、python正则表达式如何匹配内容
python正则表达式如何匹配内容,培训,检测,对象,内容,正则,字符串,函数,实例,文本,以上,1、编写Python正则表达式字符串s。2、使用re.compile(python运算符的优先级规则
python运算符的优先级规则,培训,优先级,括号,规则,操作,赋值,顺序,实例,规律,以上,python运算符的优先级规则1、先执行优先级高的运算,优先级python删除元素的使用条件
python删除元素的使用条件,标准,培训,元素,条件,语句,使用方法,函数,实例,以上,之后,python删除元素的使用条件1、使用条件(1)函数remove()只关于正则表达式:将URL转换为C#字符串
关于正则表达式:将URL转换为C#字符串中的超链接的最简单方法?,关于正则表达式:将URL转换为C#字符串中的超链接的最简单方法?,方法,超链接,关于正则表达式:如何使用多个RE引擎
关于正则表达式:如何使用多个RE引擎测试正则表达式?,关于正则表达式:如何使用多个RE引擎测试正则表达式?,正则表达式,这又,引擎,测试,How关于算法:具有优先权的方程(表达式)
关于算法:具有优先权的方程(表达式)解析器?,关于算法:具有优先权的方程(表达式)解析器?,运算符,算法,堆栈,解析器,Equation (expression)关于语言不可知:获取URL的一部分(正
关于语言不可知:获取URL的一部分(正则表达式),关于语言不可知:获取URL的一部分(正则表达式),正则表达式,单行,给定,如何使用,Getting parts关于c#:条件格式-百分比到颜色的转
关于c#:条件格式-百分比到颜色的转换,关于c#:条件格式-百分比到颜色的转换,方法,红色,的是,百分比,Conditional formatting — percent