按位运算&数学等价式

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,可用于判断奇偶

数学等价式:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值