blog: vonv.tk
按位运算符C++共有6个<< , >> , ~ , & , | , ^
移位运算符
//左移运算符<<语法:
value << shift //value是被操作的整数值,shift是要移动的位数
//功能:左移一位相当于乘2,左移n位相当于乘以2的n次方
//左移运算符在汇编语言中直接修改寄存器的内容,但是C++生成一个新值,如:
int x=30;
int y= x<<3;
//
x=x<<4;
y<<=2;
//右移运算符<<语法:
value >> shift //value是被操作的整数值,shift是要移动的位数
//功能:左移一位相当于除以2,左移n位相当于除以2的n次方,如:
int x=4;
x>>1;
x>>=1;
逻辑按位运算符
//按位非 ~
//先将数写成二进制形式,再将每个0化为1,
//功能:新值是原值的补位,如
unsigned char x=3;
十进制中~3=252,
//按位 OR(|)对两个整数进行操作,生成一个新的整数值。
//将数写成二进制形式,对应位“见1为1”
//可以组合赋值运算符,如
a |= b;
//按位 XOR(^)将两个数结合起来,生成一个新的整数值。
//将数写成二进制形式,对应位“不同为1,相同为0”
//可以组合赋值运算符,如
a ^= b;
异或性质:
(1)交换律:A ⊕ B = B ⊕ A
(2)结合律:A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C
(3)自反:A ⊕ B ⊕ B = A ⊕ 0 = A
异或的应用:
(1)快速比较两个值
判断两个int数字a,b是否相等a ^ b == 0则a,b相等。
(2)在汇编语言中经常用于将变量置零:xor a,a;
(3)我们可以使用异或来使某些特定的位翻转,因为不管是0或者是1与1做异或将得到原值的相反值;
0 ^ 1 = 1
1 ^ 1 = 0
(4)我们使用异或来判断一个二进制数中1的数量是奇数还是偶数
例如:求10100001中1的数量是奇数还是偶数; 答案:1 ^ 0 ^ 1 ^ 0 ^ 0 ^ 0 ^ 0 ^ 1 = 1,结果为1就是奇数个1,结果为0就是偶数个1; 应用:这条性质可用于奇偶校验(Parity Check),比如在串口通信过程中,每个字节的数据都计算一个校验位,数据和校验位一起发送出去,这样接收方可以根据校验位粗略地判断接收到的数据是否有误
(5)校验和恢复
校验和恢复主要利用的了异或的特性:IF a ^ b = c THEN a ^ c = b 应用:一个很好的应用实例是RAID5,使用3块磁盘(A、B、C)组成RAID5阵列,当用户写数据时,将数据分成两部分,分别写到磁盘A和磁盘B,A ^ B的结果写到磁盘C;当读取A的数据时,通过B ^ C可以对A的数据做校验,当A盘出错时,通过B ^ C也可以恢复A盘的数据。
(6)经典题目:不使用其他空间,交换两个值
a = a ^ b;
b = a ^ b; //a ^ b ^ b = a ^ 0 = a;
a = a ^ b;
(7)面试题:互换二进制数的奇偶位;
以上性质来自金马的Blog
//按位 AND(&)将两个数结合起来,生成一个新的整数值。
//将数写成二进制形式,对应位“同为1结果才为1”
//可以组合赋值运算符,如
a &= b;
a & 1//取a二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
数学等价式: