鱼C论坛

 找回密码
 立即注册
查看: 1454|回复: 0

[技术交流] C++ 位运算

[复制链接]
发表于 2020-1-16 17:18:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C++ 位运算


1. 位运算概念

位运算是 C++ 中的基本运算之一。即便是这样,大多数编程人员都很少使用位运算。

所有数据在计算机中都是按二进制存储的,例如 01100011。

一个数据可以看做是一个有序的位集合,比如 01100011 就是由 8 个位组成的。每个位的状态要么是 0,要么是 1。

位运算允许操作数据的某一特定位,比如说将某位设置为 1 或 0。

位运算由位运算操作符和操作数组成,不同的位运算操作符定义了不同的位运算。

2. 位运算操作符

位运算操作符非常多,常见的有:按位非、左移、右移、按位与、按位或、按位异或。

按位非

符号:~

用法:~a

含义:翻转数 a 的每一位,把 1 变成 0,把 0 变成 1。例如,二进制数 00010110 按位非的结果是 11101001。

左移

符号:<<

用法:a << n

含义:将数 a 向左移动 n 位,右边的位补 0。例如,二进制数 101001 左移的结果是 1010010,10100.1 左移的结果是 101001。

将数 a 左移一位相当于把 a 乘以 2,将数 a 左移 n 位相当于将数 a 乘以 2n

注意:左移操作如果超出数据范围,则移到外面的数会被丢弃。

右移

符号:>>

用法:a >> n

含义:将数 a 向右移动 n 位(与左移相反),左边的位补 0,因此右移 n 为相当于除以 2n。例如二进制数 101001 右移的结果是 10100.1。

注意:和左移一样,右移操作如果超出数据范围,则移到外面的数会被丢弃。

按位与

符号:&(和取址符的符号一样)

用法:a & b

含义:在每一位所在处,如果 a 和 b 都含有 1,那么该位的结果为 1,否则为 0。例如,二进制数 1010 & 1100 等于 1000。

按位或

符号:|

用法:a | b

含义:在每一位所在处,如果 a 和 b 都含有 0,那么该位的结果为 0,否则为 1。例如,二进制数 1010 | 1100 等于 1110。

按位异或

符号:^

用法:a ^ b

含义:在每一位所在处,如果 a 和 b 不相同,那么该位的结果为 1,否则为 0(同 0 异 1)。例如,1010 ^ 1100 等于 0110。

3. 位操作

说明:下面的 n 从 0 开始。

1. 将 a 的第 n 位设置为 1

  1. a |= (1 << n);
复制代码


2. 将 a 的第 n 位设置为 0

  1. a &= (~(1 << n));
复制代码


3. 判断 a 的第 n 位是否为 1

  1. bool b = a & (1 << n);
复制代码


4. 翻转 a 的第 n 位(如果是 0 则改为 1,反之改为 0)

  1. a ^= (1 << n);
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 19:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表