C/C++中几种操作位的方法

参考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);

 

时间: 2024-10-07 16:36:10

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

EntityFramework中几种操作小结

目前项目中使用到的EntityFramework中几种操作小结,先标记下.没有详细介绍,后续有空的话再补充一些并完善一下. ? 列中加入RowVersion时间戳 ????public class Product????{????????public int Id { get; set; }????????public string Name { get; set; } ????????[Timestamp]????????public Byte[] RowVersion { get; set;

ASIC设计中一种通用型并行设计方法

我是个"低调"的人,总不喜欢表达出来,对异性如此,对工作也是如此.在翔哥的鼓励下,决定把自己工作的一些经验和思考写下来,和同道们一起分享. ASIC设计中一种通用型并行设计方法: 1)流水网的概念提出 IC设计中的控制有串行和并行两种思想.状态机方法反应了串行控制思想,有软件的思路,比较好理解,新手比较喜欢用.流水线方法是并行处理的思想,比较抽象,因为其效率高,老手喜欢用.从"流水线"的名字就容易知道,它只是一维的一条线,一个设计中可以有很多条.小设计中可能很容易设

JSP中四种传递参数的方法

jsp中四种传递参数的方法,我觉得总结一下,挺好的,以备后用! 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="index.jsp"?a=a&b=b&c=c>name</a> 1.form表单 form.jsp: <%@page contentType="text/html; charset=GB2312"%> &l

ES6中6种声明变量的方法

ES5 只有两种声明变量的方法:var命令和function命令. ES6 除了添加let和const命令,还有两种声明变量的方法:import命令和class命令. 所以,ES6 一共有 6 种声明变量的方法. (1) var命令. var a ; //undefined var b = 1; var定义的变量可以修改,如果不初始化会输出undefined,不会报错 var 声明的变量在window上,用let或者const去声明变量,这个变量不会被放到window上 很多语言中都有块级作用域

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

1)DOM(JAXP Crimson解析器)     DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像

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

转自:https://blog.csdn.net/rainy_black_dog/article/details/52403735 很早以前听过一位老师说过:咱们中国人不管学习哪种编程语言,总会遇到乱码问题.所以大家在使用Eclipse的过程中肯定也会遇到编码的问题.乱码出现的原因是编码和解码格式的不一致造成的.(关于乱码产生的原因,就不在这里介绍了) 下面来介绍三种方式如何设置Eclipse的编码格式: 第一种:只设置当前*.java文件的编码格式 在当前*.java文件中,按Alt+回车,会

python中几种数据类型常用的方法

''' python几种数据类型常用方法: 列表 增加:append,insert,extend 删除:remove,pop,clear 修改: 查询:index,count 元组 查询:index,count *:解包操作 集合 增加:add 删除:pop,clear,remove 字典 增加:字典['键'] = 值 删除:pop,popitem,clear 修改:update(dict) 查询:get,keys,items,values,setdefault:有对应的键则返回对应的值,没有则

Java Web开发Tomcat中三种部署项目的方法

一般情况下,开发模式下需要配置虚拟主机,自动监听,服务端口,列出目录文件,管理多个站点等功能 准备工作: 软件包:apache-tomcat-6.0.20.rar 将软件包解压至硬盘一分区,进入%TOMCAT_HOME%/conf目录 一:server.xml 配置 1.配置端口,修改server.xml. <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000"

Android 中三种启用线程的方法

在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应.  而Runnable是一个接口,Thread是Runnable的子类.所以说,他俩都算一个进程.  HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息