首先了解位运算,要知道java中默认的整数是int型的,占4个byte,是以32位的二进制存在。
举个例子:
十进制 二进制
6 0000-0000 0000-0000 0000-0000 0000- 0110
那么接下来进行位运算:
位运算一般有>>,<<,>>>,
>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。
<< 表示左移,移动之后,右边的低位用0补空位。
6>>2
运算过程就是:将6的二进制表现形式,向右移2位,空出来的高位用0补上,如果是负数,就补1
|0000-0000 0000-0000 0000-0000 0000- 0110|
-->
00|00-0000 0000-0000 0000-0000 0000- 0001|10
这样就得出了6>>2的结果00-0000 0000-0000 0000-0000 0000- 0001:转为十进制就等于1
同理
6<<2
|0000-0000 0000-0000 0000-0000 0000- 0110|
-->
00|00-0000 0000-0000 0000-0000 0000- 011000|
同样得出结果00-0000 0000-0000 0000-0000 0000- 011000 ,转为十进制就等于24
从这里我们可以看出来,6<<2运算就是6/(2^2)=1,6>>2运算就是6*(2^2)=24;
所以位运算用于对2的次幂,
注意:>>>,>>区别
都是右移运算,但是>>有符号位,在补位的时候正数补0,负数补1,而>>>都是用0补位,这一点特别注意!
同时在这里写一个小方法:
我们都知道java中两个数a,b互换,需要借助第三方变量作为临时变量来存储数据,再进行互换
在这里我提供两个不需要临时变量的方法,自己娱乐使用,仅供大家参考
int a=3,b=5;
a=a+b;
b=a-b;
a=a-b;
这种方法还有一个小问题:
a+b,可能会超出int型的最大范围,造成进度丢失
下面一种使用的是^运算,异或运算,一个数异或另一个数两次就得到它本身,即:int a=3,b=5; a=a^b; b=a^b; a=a^b;
3^5^5=3;
所以这两种方式都可以完成两数互换大小。
这里是菜鸟的自我理解和随笔,若有理解错误,往各位大牛不吝赐教。