位运算符及原码、反码和补码 public class OperatorDemo{
public static void main(String[] args){
//计算机内部的数据都是以二进制形式存在的
/*
而二进制在计算机内部又有多种编码存在
原码:
反码:
*补码:
计算机内部对二进制进行运算用的是补码。比如1-1=1+(-1)=0;
原码:3: 0000 0011 第一位符号位,0代表正,1代表负
反码:正数的反码和原码一样,负数的反码,保留符号位,其余按位取反。
1000 0011(原码)-->1111 1100(反码)
补码:正数的反码、原码、补码都一样,负数的补码=反码+1;
1000 0011(原码)-->1111 1100(反码)-->1111 1101(补码)
负数的原码和补码之间的转换:
负数的原码=负数的补码-1 再取反
1、 10001(原码)-->11110+1=11111;
2、 11111-1=11110-->10001
3、 能不能先把补码取反再加上1呢?
11111-->10000+1-->10001
*/
int num1=128;
int num2=129;
System.out.println("num1和num2是"+(num1&num2));//128
/*
0000 0000 0000 0000 0000 0000 1000 0000(补码,跟原码相同)
0000 0000 0000 0000 0000 0000 1000 0001(补码)
------------------------------------------
0000 0000 0000 0000 0000 0000 1000 0000(补码)
*/
System.out.println("num1或num2是"+(num1|num2));//129
/*
0000 0000 0000 0000 0000 0000 1000 0000(补码,跟原码相同)
0000 0000 0000 0000 0000 0000 1000 0001(补码)
------------------------------------------
0000 0000 0000 0000 0000 0000 1000 0001(补码)
*/
System.out.println("num1异或num2是"+(num1^num2));//1
/*
0000 0000 0000 0000 0000 0000 1000 0000(补码,跟原码相同)
0000 0000 0000 0000 0000 0000 1000 0001(补码)
------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0001(补码)
*/
System.out.println("num1非的结果是"+(~num1));//-129
/*
0000 0000 0000 0000 0000 0000 1000 0000(补码,跟原码相同)
1111 1111 1111 1111 1111 1111 0111 1111(补)
-------------------------------------------
1000 0000 0000 0000 0000 0000 1000 0001(原码)
*/
System.out.println(2<<3);//16
/*
0000 0000 0000 0000 0000 0000 0000 0010(补码)
0000 0000 0000 0000 0000 0000 0001 0000(补码)
*/
System.out.println(-2<<3);//-16
/*
1000 0000 0000 0000 0000 0000 0000 0010(原码)
1111 1111 1111 1111 1111 1111 1111 1101(反码)
1111 1111 1111 1111 1111 1111 1111 1110(补码)左移3位
--------------------------------------------
1111 1111 1111 1111 1111 1111 1111 0000(补码)
1000 0000 0000 0000 0000 0000 0000 1111(反码)
1000 0000 0000 0000 0000 0000 0001 0000(原码)
*/
System.out.println(16>>3);//2
/*
0000 0000 0000 0000 0000 0000 0001 0000(补码)
0000 0000 0000 0000 0000 0000 0000 0010(补码)
*/
System.out.println(-16>>3);//-2
/*
1000 0000 0000 0000 0000 0000 0001 0000(原码)
1111 1111 1111 1111 1111 1111 1110 1111(反码)
1111 1111 1111 1111 1111 1111 1111 0000(补码)右移3位
------------------------------------------
1111 1111 1111 1111 1111 1111 1111 1110(补码)
1000 0000 0000 0000 0000 0000 0000 0001(取反)
1000 0000 0000 0000 0000 0000 0000 0010(原码)
*/
System.out.println(-16>>>3);//-2
/*
1000 0000 0000 0000 0000 0000 0001 0000(原码)
1111 1111 1111 1111 1111 1111 1110 1111(反码)
1111 1111 1111 1111 1111 1111 1111 0000(补码)右移3位
------------------------------------------
0001 1111 1111 1111 1111 1111 1111 1110(补码)
*/
//System.out.println(3<<<3);没有这种类型,尴尬
/*
0000 0000 0000 0000 0000 0000 0000 0011(补码)向左移动三位
------------------------------------------
0000 0000 0000 0000 0000 0000 0001 1000(补码)
*/
}
}
位运算符及原码、反码和补码