zltzlt 发表于 2020-1-16 17:18:20

C++ 位运算

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

a |= (1 << n);

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

a &= (~(1 << n));

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

bool b = a & (1 << n);

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

a ^= (1 << n);
页: [1]
查看完整版本: C++ 位运算