天天看点

位运算符及原码、反码和补码

位运算符及原码、反码和补码
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(补码)
		*/
		
		
		
		
		
	}
	
}
           
位运算符及原码、反码和补码