JavaWeb开发实战指南----位运算符

/**
*@Title: ${filename}
*@Package: ${package_name}
*@Description: ${todo}
*位运算符
左移<<  
右移>>
与 &
或 |
异或 ^
反码 ~
*
*@author:  源代码资料尽在"清哥好课堂"公众号:qghktit
*@date: ${date}${time}
*@version: 1.0
*/
public class BitwiseOp 
{
	public static void main(String[] args) 
	{
		/*
		反码 ~
		以补码进行运算
		取反,符号位也要参与运算, 1-->0  0-->1
		*/
		System.out.println(~5);
		/*
		5补码  0000-0000 0000-0000 0000-0000 0000-0101
		~5结果1111-1111 1111-1111 1111-1111 1111-1010
		结果是一个负数,补码转原码
		结果的原码
				   1000-0000 0000-0000 0000-0000 0000-0110
		结果:-6
		*/

		System.out.println(~-5);
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		~-5结果: 0000-0000 0000-0000 0000-0000 0000-0100
		结果 是一个正数,补码和原码相同
		结果  4
		*/
	}
	public static void main5(String[] args) 
	{
		/*
		异或 ^
		相同为0,不同为1
		1^1 = 0		0^0=0
		1^0 = 1		0^1=1
		以补码参与运算
		*/
		System.out.println(5^6);
		/*
		5补码  0000-0000 0000-0000 0000-0000 0000-0101
		6补码  0000-0000 0000-0000 0000-0000 0000-0110
		结果:0000-0000 0000-0000 0000-0000 0000-0011
		3
		*/
		System.out.println(5^6^5);
		/*
		5补码  0000-0000 0000-0000 0000-0000 0000-0101
		6补码  0000-0000 0000-0000 0000-0000 0000-0110
		结果:0000-0000 0000-0000 0000-0000 0000-0011
		5补码  0000-0000 0000-0000 0000-0000 0000-0101
		结果    0000-0000 0000-0000 0000-0000 0000-0110
		6
		一个数与同一个数异或两次,得到它自己
		*/
		System.out.println(-5^6);
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		6补码         0000-0000 0000-0000 0000-0000 0000-0110
		结果			  1111-1111 1111-1111 1111-1111 1111-1101
		是一个负数,补码转原码
		结果的原码 1000-0000 0000-0000 0000-0000 0000-0011
		-3
		*/
		System.out.println(-5^6^6);  //-5

		System.out.println(-5^-6);
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		-6的原码    1000-0000 0000-0000 0000-0000 0000-0110
		-6的补码: 1111-1111 1111-1111 1111-1111 1111-1010
		-5^-6结果  0000-0000 0000-0000 0000-0000 0000-0001
		结果 是正数
		1
		*/
		System.out.println(-5^-6^-6); //-5
		System.out.println(-5^-6^-5); //-6
	}
	public static void main4(String[] args) 
	{
		/*
		或 |
		补码进行运算
		0|0=0
		1|0=1
		0|1=1
		1|1=1
		只要有1就是1
		*/
		System.out.println(5|6);
		/*
		5补码  0000-0000 0000-0000 0000-0000 0000-0101
		6补码  0000-0000 0000-0000 0000-0000 0000-0110
		结果: 0000-0000 0000-0000 0000-0000 0000-0111
		7
		*/
		System.out.println(-5|6);
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		6补码         0000-0000 0000-0000 0000-0000 0000-0110
		-5|6的结果 1111-1111 1111-1111 1111-1111 1111-1111
		结果是一个负数,负数补码转原码
		结果的原码 1000-0000 0000-0000 0000-0000 0000-0001
		-1
		*/
		System.out.println(-5|-6);
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		-6的原码    1000-0000 0000-0000 0000-0000 0000-0110
		-6的补码: 1111-1111 1111-1111 1111-1111 1111-1010
		-5|-6结果:1111-1111 1111-1111 1111-1111 1111-1011
		结果是一个负数  负数补码转原码
		结果的原码 1000-0000 0000-0000 0000-0000 0000-0101
		-5
		*/
		
	}
	public static void main3(String[] args) 
	{
		//与 &
		/*
		补码参与运算
		1&1=1
		1&0=0
		0&1=0
		0&0=0
		只要有0就是0
		*/
		System.out.println(5&6); //4
		/*
		5补码  0000-0000 0000-0000 0000-0000 0000-0101
		6补码  0000-0000 0000-0000 0000-0000 0000-0110
		结果    0000-0000 0000-0000 0000-0000 0000-0100
		4
		*/
		System.out.println(-5&6);  //2
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		6补码         0000-0000 0000-0000 0000-0000 0000-0110
	-5&6的结果   0000-0000 0000-0000 0000-0000 0000-0010
		结果为一个正数, 补码和原码相同
			转十进制   2
		*/
		System.out.println(-5&-6);
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		-6的原码    1000-0000 0000-0000 0000-0000 0000-0110
		-6的补码: 1111-1111 1111-1111 1111-1111 1111-1010
	-5&6的结果   1111-1111 1111-1111 1111-1111 1111-1010
		结果为一个负数,负数的补码转原码
		结构的原码 1000-0000 0000-0000 0000-0000 0000-0110
			转十进制  -6
		*/
	}
	public static void main2(String[] args) 
	{
		//右移>>   正数是每右移一位,除2
		//右移运算,往右移,低位会被移出,高位上要补
		//补,符号位上的数,要是正数补0。要负数,补1
		System.out.println(5>>1); //2    5/2=2
		/*
		在补码的基础上进行
		5 的补码就是其原码
		0000-0000 0000-0000 0000-0000 0000-0101
		5>>1之后的结果 
		0 0000-0000 0000-0000 0000-0000 0000-010
		*/
		System.out.println(5>>2); // 1  5/2/2=1
		System.out.println(5>>3); // 0  5/2/2/2=0

		System.out.println(-5>>1);  //-3
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		-5>>1的结果 
		1111-1111 1 111-1111 1 111-1111 1 111-1101
		结果是一个补码
		转成原码
		1000-0000 0000-0000 0000-0000 0000-0011
		转十进制
		-3
		*/
		System.out.println(-5>>2);  //-2
		System.out.println(-5>>3);  //-1
		System.out.println(-5>>4);  //-1
		System.out.println(-5>>5);  //-1

	}
	public static void main1(String[] args) 
	{
		/*
		数  用二进制来表示   用多少位来,机器字长来决定
		机器字长32位, 4个8位,即4个字节
		研究的是带符号的数,正数,负数
		符号位, 最高位,最左边的位  0 表示正数,1表示负数 
		符号位1  数据位31

		在计算机当中,数的编码格式,有四种
		原码
		(反码)  
		补码
		对于正数来说,原码和补码相同
		对于负数来说,原码的基础上得到补码,
				在原码的基础上,除符号位以外,其它位分别取反, + 1,得到补码
				补码-->原码
				在补码的基础上,除符号位以外,其它位分别取反后+1,得到原码
		*/
		//左移<<  正数  右边空位(低位上补0)
		System.out.println(5<<1);  //5左移一位,变成10  5*2
		System.out.println(5<<2);  //5左移两位,变成20  5*2*2
		//对于正数,左移<< 每移一位,相于乘2
		System.out.println(-5<<1);  //-10   -5*2
		/*
		-5的原码:1000-0000 0000-0000 0000-0000 0000-0101
		-5的补码:1111-1111 1111-1111 1111-1111 1111-1011
		-5<<1
		高位移出, 低位补0
		x结果: 1】111-1111 1111-1111 1111-1111 11111-0110
		结果 是一个补码
		转成原码后才能转成十进制
		结果的原码:1000-0000 0000-0000 0000-0000 0000-1010
		-10
		*/
		System.out.println(-5<<2);  //-20
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值