位运算

由于计算机是以二进制方式存储数据的,因此对于某些运算,使用位运算能够大大提升计算速度,并且能够节省内存。

一、基础知识

&:“与”

&与操作,只有当两个相应的二进制位都为1时,此值为1。

如:1&1=1 , 0&1=0 , 1&0=0 , 0&0=0

应用:

1)某些清零操作。利用0与任何值进行&运算的结果都为0的特性。
2) 判断奇偶性。由于1的二进制中只有最后一位为1,其余值为0。n&1=1时,表示n的最后一位为1,则n是奇数,反之
   n&1=0时,n为偶数。
3) 取指定位元素。比如x=0000 0101,如果想取x的最后四位,则设置y为0000 1111,取后四位的操作为x&y。

|:“或”

| 或操作,当两个相应的二进制位有一个为1时,此值为1。

如:1|1=1 ,1|0=1 ,0|1=1 ,0|0=0

应用:

只对某些位设置为1.例如:x=0000 0101, 若要设置后三位的值为1,则y设置为0000 0111,设置操作为x|y。

^:“异或”

^ 异或操作,当两个相应二进制位不同时,此值为1.

如: 1^ 0=1 ,0^ 1=1 , 1^1=0 ,0 ^ 0=0

异或操作特性:

交换律:a ^ b=b ^ a
结合律:(a ^b) ^c=a ^( b ^ c)
结合律:x ^ x =0 ,x ^ 0=x
自反性:a ^ b ^ b=a ^ 0=a

应用

(1)翻转某些位,特点:与0进行^操作,值不变,与1进行^操作,值相反
(2) 交换两个数,利用结合律和自反性

~:“取反”

~取反操作,该二进制的所有1变为0,0变为1.

如:~1=0 ,~ 0=1

应用:指定位为0

<<:“左移”

<< 左移操作,在二进制中相当于将数乘以2。

需要注意的是正负和负数的区别。

二进制表示分为有符号位表示和无符号位表示,有符号位最高位表示符号位,由符号位+数值组成,符号位中1表示负数,0表示正数。

对于正数而言,左移操作低位补0,如:0000 0101<<1=0000 1010
对于负数而言,左移操作和正数相同,低位补0,如:1100 0111<<1=1000 1110

由于机器中数是以补码形式存储的,而正数的补码等于原码(补码和原码后期会出相关知识),负数的补码高位为1,数值位与原码相反,并且最后一位加1。所以,若一个负数不断的进行左移,最终所有位置都为0,此时值表示为0。

>>:“右移”

. >>右移操作 ,在二进制位中相当于将数除以2

右移和左移操作类似,同样讨论正数和负数的区别:

对于正数而言,右移操作高位补0,如:0000 0101>>1=0000 0010
对于负数而言,右移高位补1,如:1100 0111>>1=1110 0011

若一个负数不断右移,高位补1,最终所有位置都将为1,此时值表示为-1

左移和右移的例子:
3:0000 0011 , 3>>1 : 0000 0001 , 3<<1 : 0000 0110
-3: 1111 1101 , -3>>1 : 1111 1110 , -3<<1 : 1111 1010

二、注意事项

(1)若两个长度不用的数进行位操作时,按右端对齐,左端按数据正负补0或1
(2)移位大于最大位数时,移动位数按除余操作计算
(3)移位为负数时,用最大位数与负数相加得到的值即为移动位数

在一些问题中,将位运算结合使用将达到更快的速度,如m的n次方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值