Java位运算
必读:二进制的转换
二进制 → 十进制
将二进制的(111)B转换为十进制的步骤如下:
1. 第0位 1 x 2^0 = 1;
2. 第1位 1 x 2^1 = 2;
3. 第2位 1 x 2^2 = 4;
4. 读数,把结果值相加,1+2+4=7,即(111)B=(7)D。
十进制 → 二进制
将十进制的(43)D转换为二进制的步骤如下:
1. 将商7除以2,商3余数为1;
2. 将商3除以2,商1余数为1;
3. 将商1除以2,商0余数为1;
4. 读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,111,即(7)D=(111)B。
必读:原码,反码,补码(负整数如何转成二制制)
int 值 -7为例子
1.按照绝对值大小转换成的二进制数,称为原码 -->[绝对值大小]
0000 0000 0000 0111 -->原码
2.反码:将二进制数原位取反,所得的新二进制数 -->(1变0,0变1)
1111 1111 1111 1000
3.补码:反码加1称为补码
1111 1111 1111 1000 + 1 = 1111 1111 1111 1001
补码为:1111 1111 1111 1001
重点:在计算机中,负值以其正值的补码形式表达.
也就是说,-7的二进制数是:
是,是,是:1111 1111 1111 1001
正数的话,原码和反码,补码相同!!!!!!
正数的话,原码和反码,补码相同!!!!!!
正数的话,原码和反码,补码相同!!!!!!
左移(<<)
package com.when
public void Main{
public static void main(String[] args){
System.out.println(7<<2)
//输出结果为:28
}
}
执行逻辑
0000 0000 0000 0111 --> (7)D ,左移2位,空位补为0,转换位下面数字
0000 0000 0001 1100 --> (28)D
右移(>>)
package com.when
public void Main{
public static void main(String[] args){
System.out.println(7>>2)
//输出结果为:28
}
}
执行逻辑
0000 0000 0000 0111 --> (7)D ,右移2位,空位补为0,转换位下面数字
0000 0000 0000 0001 --> (1)D
无符号右移(>>>)
package com.when
public void Main{
public static void main(String[] args){
System.out.println(7>>3); //输出结果为:0
System.out.println(-7>>3); //输出结果为:-1
System.out.println(-7>>>3); //输出结果为:536870911
}
}
执行逻辑
0000 0000 0000 0111 --> 表示的是二进制的7
1111 1111 1111 1001 --> 表示的是二进制的-7
7右移3位,高位用0补位,结果为0,0的表示为:0000 0000 0000 0000
-7右移三位,高位用1补位,结果为-1,-1的表示为:1111 1111 1111 1111
注意:无符号位移,高位用0补位,结果为正数
-7无符号位移为0001 1111 1111 1111,结果为:536870911
位与( & )
package com.when
public void Main{
public static void main(String[] args){
System.out.println(7&3);//结果为:3
}
}
理解:可以理解为串联的两个开关
开关1开,2关灯关
开关1关,2关灯关
开关1开,2开灯开
7转为二进制: 0000 0000 0000 0111
3转为二进制: 0000 0000 0000 0011
7&3的结果为: 0000 0000 0000 0011
位或( | )
package com.when
public void Main{
public static void main(String[] args){
System.out.println(7|3);//结果为:7
}
}
理解:并联开关
7转为二进制: 0000 0000 0000 0111
3转为二进制: 0000 0000 0000 0011
7|3的结果为: 0000 0000 0000 0111
位异或( ^ )
package com.when
public void Main{
public static void main(String[] args){
System.out.println(7^3);//结果为:4
}
}
7转为二进制: 0000 0000 0000 0111
3转为二进制: 0000 0000 0000 0011
7^3的结果为: 0000 0000 0000 0100
对应位置的值相反,则为1,否则为0
一个好玩的位异或的例子:
有两个正整数 分别为 int x = 7; int y = 4;
如何在不定义第三个变量的情况下,让int x = 4; int y=7;(可以自己想一下)
答案在下面:
==
==
==
====
====
====
====
====
====
====
==
package com.when
public void Main{
public static void main(String[] args){
int x = 7;
int y = 4;
x = x^y;
y = x^y;
x = x^y;
System.out.println("x的值为:"+x);
System.out.println("y的值为:"+y);
}
}