参考How do you set, clear and toggle a single bit in C?

c/c++中对二进制位的操作包括设置某位为1、清除某位(置为0)、开关某位(toggling a bit)、检查某位是否为1等。这些操作较为常见并且可以作为其他位运算的基础接口,以下罗列几种方法:

传统方法

  • 设置某位为1
number |= 1 << x; // 设置第x位为1
  • 清除某位
number &= ~(1 << x); // 置第x位为0
  • 开关某位
number ^= 1 << x;
  • 检查某位
if (number & (1 << x))

相应地我们可以将其封装起来,简便的方法是使用宏来封装:

#define BIT_SET(a,b) ((a) |= (1<<(b)))
#define BIT_CLEAR(a,b) ((a) &= ~(1<<(b)))
#define BIT_FLIP(a,b) ((a) ^= (1<<(b)))
#define BIT_CHECK(a,b) ((a) & (1<<(b)))

使用位结构操作

这个使用起来简单很多:

struct bits {
unsigned int a:1;
unsigned int b:1;
unsigned int c:1;
}; struct bits mybits; // set/clear a bit
mybits.b = 1;
mybits.c = 0; // toggle a bit
mybits.a = !mybits.a;
mybits.b = ~mybits.b;
mybits.c ^= 1; // check a bit
if (mybits.c)

使用STL的std::bitset

这个方法其实类似于使用位结构,只不过STL包装了这个结构定义,当然还提供了很多便捷的接口:

std::bitset<5> bits;
bits[0] = true;
bits[1] = false;
bits.set(2);
bits.flip(3);
bits.reset(2);

 

C/C++中几种操作位的方法的更多相关文章

  1. EntityFramework中几种操作小结

    目前项目中使用到的EntityFramework中几种操作小结,先标记下.没有详细介绍,后续有空的话再补充一些并完善一下. 列中加入RowVersion时间戳 public class Product ...

  2. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

  3. jsp中四种传递参数的方法

    jsp中四种传递参数的方法如下: 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="i ...

  4. Java中8种常见的排序方法

    排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...

  5. ES6中6种声明变量的方法

    相关阅读:http://es6.ruanyifeng.com/#docs/let 相关阅读:https://www.cnblogs.com/ksl666/p/5944718.html 相关阅读:htt ...

  6. java中四种操作(dom、sax、jdom、dom4j)xml方式详解与比较

    1)DOM(JAXP Crimson解析器)     DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特 ...

  7. java中四种操作xml方式的比较

    1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息. ...

  8. Eclipse中三种设置编码格式的方法

    转自:https://blog.csdn.net/rainy_black_dog/article/details/52403735 很早以前听过一位老师说过:咱们中国人不管学习哪种编程语言,总会遇到乱 ...

  9. VC中使用ADO操作数据库的方法 SQL2000

    (1).引入ADO类 #import "c:\program files\common files\system\ado\msado15.dll" \ no_namespace \ ...

随机推荐

  1. Redis数据库?-Redis的Virtual Memory介绍(转)

    众所周知,Redis是一个内存数据库,和Memcached类似,所有数据存在内存中,当然,Redis有rdb和appendonlyfile两个落地文件,可以对断电停机等故障下的数据恢复做一些保证.但是 ...

  2. [Java A] – is not an enclosing class

    public class A {public class B { }}; 需要实例B类时,按照正逻辑是,A.B ab = new A.B();那么编译器就会出现一个错误–“is not an encl ...

  3. ADF_General JSF系列2_创建JSF类型的页面向导

    2015-02-17 Created By BaoXinjian

  4. BPEL_Oracle BPEL新一代工作流介绍(概念)

    2014-11-02 Created By BaoXinjian

  5. 有关C,C++,C#, Java的图形图像处理类库 整理(未完待续)

    1.Java相关 1.1 Jzy3D Jzy3D 是一个Java的类库,用来绘制各种各样的三维图形,如下图所示: 下载地址:jzy3d-api,官网 1.2 Proscene 是一个用于创建交互式3D ...

  6. python(5)字符串处理 (sub,replace,find,index,upper,strip,split,sub翻页

    一,sub和replace的用法 re.sub 函数进行以正则表达式为基础的替换工作 re.sub替换到目标字符串中的a,b或者c,并全部替换 另加上sub翻页操作: re.sub('start=\d ...

  7. 股票k线

    与上一篇文章相比k线图主要的难点 1.tooltip的定制化显示: 当手指触摸手机屏幕上下拖动可能会手指的事件陷入图表无法进行上下拖动 tooltip:{followMouseMove} follow ...

  8. iOS8 StoryBoard 连线diss方法

    添加自定义Dismiss类: //  Dismiss.h //  StoryBoardTest // //  Created by zhujin on 14/12/23. //  Copyright ...

  9. ubuntu vnc install

    windows & ubuntu http://www.jb51.net/os/Ubuntu/104948.html ubuntu & ubuntu https://www.digit ...

  10. DedeCms完美的FLASH幻灯代码

    <div id="banner"> <script language='javascript'> linkarr = new Array(); picarr ...