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

本文详细介绍了Java中位运算符的应用,包括与、或、异或、非运算等基本概念及其实现原理,并通过实例展示了左移、右移、无符号右移等操作的具体效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(补码)
		*/
		
		
		
		
		
	}
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值