【java学习笔记三】位运算操作总结

位运算符 &、|、~、^、>>、<<

位运算符包含与运算符、或运算符、取反运算符、异或运算符、左移运算符、右移运算符和无符号右移。


& 与运算符

规则: 与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值都是 1,则结果值相应的 bit 就是 1,否则为 0.

0 & 0 = 0,

0 & 1 = 0,

1 & 1 = 1
3 & 5 = 1

这是因为

0000 0011

&

0000 0101

=

0000 0001
按照规则,将两个数值按照低位到高位一一对齐运算,因为只有第 0 位都为 1,所以计算结果为 1.、

&&和&都是表示与,区别是&&只要第一个条件不满足,后面条件就不再判断。而&要对所有的条件都进行判断。


| 或运算符

规则: 与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值只要 1 个为 1,则结果值相应的 bit 就是 1,否则为 0。

0 | 0 = 0,

0 | 1 = 1,

1 | 1 = 1
3 | 5 = 7

这是因为

0000 0011

|

0000 0101

=

0000 0111

 

 ||和|都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断。


~ 取反运算符

规则: 对操作数的每一位进行操作,1 变成 0,0 变成 1。

~5 =>  0000 0101

~  => 1111 1010


^ 异或运算符

规则: 两个操作数进行异或时,对于同一位上,如果数值相同则为 0,数值不同则为 1。

1 ^ 0 = 1,

1 ^ 1 = 0,

0 ^ 0 = 0;

3 ^ 5 = 6,

这是因为

0000 0011

|

0000 0101

=

0000 0110

值得注意的是 3 ^ 5 = 6,而 6 ^ 5 = 3

0000 0110

|

0000 0101

=

0000 0011

针对这个特性,我们可以将异或运算作为一个简单的数据加密的形式。比如,将一个mp4文件所有数值与一个种子数值进行异或得到加密后的数据,解密的时候再将数据与种子数值进行异或一次就可以了。

所以说异或运算可以作为简单的加解密运算算法。


>> 右移运算符

规则: a >> b 将数值 a 的二进制数值从 0 位算起到第 b – 1 位,整体向右方向移动 b 位,符号位不变,高位空出来的位补数值 0。

5 >> 1 ===>  1000 0000 0000 0101 >> 1  = 1000 0000 0000 0010 = 27 >> 2 ===>  1000 0000 0000 0111 >> 2  = 1000 0000 0000 0001 = 19 >> 3 ===>  1000 0000 0000 1001 >> 3  = 1000 0000 0000 0001 = 111 >> 2 ===> 1000 0000 0000 1011 >> 2 = 1000 0000 0000 0010 = 2

大家发现什么规律没有?

a >> b = a / ( 2 ^ b ) ,所以 5 >> 1= 5 / 2 = 2,11 >> 2 = 11 / 4 = 2。


<< 左移运算符

规则: a << b 将数值 a 的二进制数值从 0 位算起到第 b – 1 位,整体向左方向移动 b 位,符号位不变,低位空出来的位补数值 0。

5 << 1 ===>  1000 0000 0000 0101 << 1  = 1000 0000 0000 1010 = 107 << 2 ===>  1000 0000 0000 0111 << 2  = 1000 0000 0001 1100 = 289 << 3 ===>  1000 0000 0000 1001 << 3  = 1000 0000 0100 1000 = 7211 << 2 ===> 1000 0000 0000 1011 << 2 = 1000 0000 0010 1100 = 44

很明显就可以看出

a << b = a * (2 ^ b)

综合上面两个可以看到,如果某个数值右移 n 位,就相当于拿这个数值去除以 2 的 n 次幂。如果某个数值左移 n 位,就相当于这个数值乘以 2 ^ n。

 

>>>无符号右移

规则: 无符号右移,忽略符号位,空位都以0补齐

无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义

发表评论

电子邮件地址不会被公开。 必填项已用*标注