C++复合运算符 “按位或并赋值“的妙用
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++复合运算符 “按位或并赋值“的妙用相关的知识,希望对你有一定的参考价值。
博主在阅读openmesh源码时看到了如下代码(其中与本文要说明内容无关的部分已经略去)
size_t id = 0;
if (edgeData_[i].is_new) id |= 1;// |= 按位或并赋值
if (edgeData_[ii].is_new) id |= 2;
if (id)
//
// set outer links
switch (id)
case 1: // prev is new, next is old
//
break;
case 2: // next is new, prev is old
//
break;
case 3: // both are new
if (!halfedge_handle(vh).is_valid())
//
else
//
break;
// set inner link
//
else ……;
注意到id这个size_t类型的变量,其身份明显是一个开关,首先给id的初值是0,紧跟着两个if语句,如果布尔条件成立,id相继会和1,2做按位或的操作。读到这里我想,既然0和任何一个数进行或操作得到的结果还是那个数本身,那么直接赋值1和2不就好了?
问题的关键点是“相继”,如果直接赋值,2会将1给覆盖掉,10会将01变成10。可如果换成按位或,01和10将会得到11,也就是后面switch语句出现的case 3分支。因此按位或在这里以特别简洁的形式实现了复杂的功能,是很优雅的写法。
以上是关于C++复合运算符 “按位或并赋值“的妙用的主要内容,如果未能解决你的问题,请参考以下文章
《Go语言精进之路》读书笔记 | 使用复合字面值作为初值构造器