二进制位运算符

位运算:程序中所有的数,在内存中都是以二进制的形式存储的。位运算就是对二进制位进行的位操作(逻辑操作)。
& 与运算
| 或运算
^ 异或运算
~ 反码
<< 左移
>> 右移
>>> 无符号右移
优点:特定情况下,计算方便,速度快,被支持面广。如果用算术方法,速度慢,逻辑复杂。
1.按位与 &

两位全为1,结果才为1。
例:0&0=0; 0&1=0;1&1=1;
17 & 7 即 0001 0001 & 0000 0111 = 0000 0001 因此 17&7=20=1
位运算的特殊用法:
(1)清零。如果想将一个单元清零,即使全部二进制位为0,只要与一个各位都为0的数值相等,结果为0。
(2)取一个数中指定位。
例:设X=10101110,取X的低4位,用X & 0000 1111 = 0000 1110
方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可得到X中的指定位。

2.按位或 |

只要有一个为1,结果就为1。
例:0|0=0;0|1=1;1|1=1
17 | 7 即 0001 0001 | 0000 0111 = 0001 0111 因此17|7=24+22+21+20=23
或运算的特殊用法:
常用来对一个数据的某些位置1。

3.异或运算 ^

两个相应位为“异”(值不同),则该位结果为1,否则为0。
例:0^0=0; 0^1=1; 1^0=1; 1^1=1
17^7 即 0001 0001^ 0000 0111 = 0001 0110 因此
17^7 =24+22+21=22
异或运算的特殊用途:
(1)使特定位翻转,找一个数,对应X要翻转的各位,该数的对应位为1,其余位为0,此数与X对应位异或即可。
(2)与0相异或,保留原值。
两个变量交换值的方法:
1.借助第三个变量来实现
C=A;A=B;B=C
2.利用加减法实现两个变量的交换
A=A+B;B=A-B;A=A-B;
3.用位异或运算实现,效率最高
原理:利用一个数,异或本身等于0和异或运算符合交换率。
A=A^B; B=A^B; A=A^B;

4.取反运算 ~

对一个二进制数按位取反,即将0变为1,1变为0。

5.左移运算 <<

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)
例 :2<<1 //2的二进制是10,左移1位得到100=4
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
例:11(1011)<<2 = 44
11(00000000 00000000 00000000 1011)(32bit)

6.右移运算 >>

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2。
例: 4(100)>>2 = 1
-14(11110010)>>2=-4(11111100)

7.无符号右移运算 >>>

各个位向右移指定的位数。右移后左边空出的位用0来填充。移出右边的位被丢弃
例:-14>>>2
即-14(11111111 11111111 11111111 11110010)>>>2
=(00111111 11111111 11111111 11111100)
=1073741820

负数以其正值的补码形式表示

原码:一个整数按照绝对值大小转换成的二进制数称为原码。

例:00000000 00000000 00000000 00001110 是14的原码

反码:将二进制数按位取反,所得的新二进制数称为二进制数的反码。

例:将00000000 00000000 00000000 00001110每一位取反
得 11111111 1111111 11111111 11110001

补码:反码加1称为补码

11111111 1111111 11111111 11110001+1=11111111 1111111 11111111 11110010
例:-14(11111111 1111111 11111111 11110010) << 2
=(11111111 1111111 11111111 11001000)只需要将该码的原码对应的正值,然后去相反数
1、补码加1得到反码:(11000111)
2、补码取反得到原码(即该负数的正值)(00111000)
3、计算正值,56
4、去相反数,-56

二进制的减法运算法则是:

0-0=1-1=0
1-0=1
0-1=1(向高位借位)

二进制的加法运算法则是:

0+0=0
0+1=1+0=1
1+1=0(向高位进位)

你可能感兴趣的:(程序设计)