位运算模板

一、概述。
位运算就是就是直接对整数在内存中的二进制位进行操作。 位运算的操作数是整数类型或字符型。
C++提供了6种位运算符来进行位运算操作:
& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 左移(左边消失,右边补0)
>> 右移(右边消失,左边补符号位)

二、具体操作。

1.按位与 &运算
将参与运算的两操作数各自对应的二进制位进行与操作。两数同时为1时为1,其他均为0。
即:0&0=0; 0&1=0; 1&0=0; 1&1=1
& 运算常常用来将某变量的某些位清0,而保留其它位不变。
& 也常用于二进制取位操作。
附注:int型是32个二进制位,16进制整数每个数字代表4个二进制位,故16进制int型常量最多是8位。

2.按位或 | 运算
|运算通常用于二进制特定位上的强制置1。参加运算的两个对象只要有一个为1,其值为1。
即:0|0=0; 0|1=1; 1|0=1; 1|1=1

3.按位异或 ^ 运算
^ 运算通常用于对二进制的特定一位进行取反操作.例如n^0xff就使得n的最后8位取反。相同为0,不同为1.
即:0 ^ 0=0; 0 ^ 1=1; 1 ^ 0=1; 1^1=0
^ 运算的特点是:如果a ^ b=c, 则有a ^ c=b和c ^ b=a
(1)使特定位翻转找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。
(2)与0相异或,保留原值 ,X ^ 0000 0000 = 1010 1110。

4.取反运算符(~)
参加运算的一个数据,按二进制位进行“取反”运算。
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0。
使一个数的最低位为零,可以表示为:a&~1。
因为“~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

5.左移<<运算
a << b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 << 2 = 400。可以看出,a << b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2(这样做要求保证高位的1不被移出)。
通常认为a << 1比a * 2更快,因此程序中乘以2的操作请尽量用左移一位来代替。很多算法和数据结构要求数据规模必须是2的幂,此时可以用<<来定义MAXN等常量。

6.右移>>运算
a >> b表示二进制右移b位(去掉末b位)。
当a是正整数时,a>>b等价于a/(2的b次方)
当a是负整数时,a>>b并不等价与a/(2的b次方),而是等于a/(2的b次方)上取整。
经常用>> 1来代替div 2,比如二分查找、堆的插入操作等等。

7.无符号右移运算符(>>>)
‘>>>’ 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。
例如:var temp = -14 >>> 2
变量 temp 的值为 -14 (即二进制的 11111111 11111111 11111111 11110010),向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)。
8.复合赋值运算符
位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:

&= 例:a &= b 相当于a=a & b

|= 例:a |= b 相当于a=a | b
>> = 例:a >>= b 相当于a=a >> b

<<= 例:a <<= b 相当于a=a << b

^= 例:a ^= b 相当于a=a ^ b

9.不同长度的数据进行位运算
如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。
以“与”运算为例说明如下:我们知道在C语言中long型占4个字节,int型占2个字节,如果一个long型数据与一个int型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足,
(1)如果整型数据为正数,左边补16个0。
(2)如果整型数据为负数,左边补16个1。
(3)如果整形数据为无符号数,左边也补16个0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值