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++复合运算符 “按位或并赋值“的妙用的主要内容,如果未能解决你的问题,请参考以下文章

C++拾遗关于复合类型

《Go语言精进之路》读书笔记 | 使用复合字面值作为初值构造器

C++中 #ifdef的妙用详解

三目(元)运算符的 前台 应用,妙用!!!

...扩展运算符妙用 - ES5中push方法的参数不能是数组

关于js代码中与或运算符||&&的妙用