反人类反社会的二进制运算

什么都不说了, 狗眼已瞎.

package com.day03;

public class Exchange {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		System.out.println("6>>2: "+(6>>2)); 
		//6:	0000 0000 0000 0000 0000 0000 0000 0110
		//右移2	0000 0000 0000 0000 0000 0000 0000 0001	10
		//多出来的1舍去, =1;
		System.out.println("-6>>2: "+(-6>>2)); 
		//-6:	1111 1111 1111 1111 1111 1111 1111 1010
		//右移2	1111 1111 1111 1111 1111 1111 1111 1110 01	右移后, 空位补全, 分正负, 正数补0, 负数补1;
		//-1	1111 1111 1111 1111 1111 1111 1111 1101
		//取反	0000 0000 0000 0000 0000 0000 0000 0010 = 2;
		//		加符号 = -2;
		
		//	>>就是除以2的右移次幂. 然后加符号
		//	6>>2  等于6除以2的2次方, 就是 6/(2*2)
		
		
		
		System.out.println("6<<2: "+(6<<2));
		//6:	0000 0000 0000 0000 0000 0000 0000 0110
		//左移2	0000 0000 0000 0000 0000 0000 0001 1000
		// =16+8=24;
		System.out.println("-6<<2: "+(-6<<2));
		//-6:	1111 1111 1111 1111 1111 1111 1111 1010
		//左移2	1111 1111 1111 1111 1111 1111 1110 1000  左移无视符号, 空位补0;
		//-1	1111 1111 1111 1111 1111 1111 1110 0111
		//取反	0000 0000 0000 0000 0000 0000 0001 1000
		
		//	<<就是乘以2的左移次幂. 然后加符号
		//	6<<2  等于6乘以2的2次方, 就是 6*(2*2)
		
		
		
		System.out.println("6>>>2: "+(6>>>2));
		//6:	0000 0000 0000 0000 0000 0000 0000 0110
		//右移2	0000 0000 0000 0000 0000 0000 0000 0001	10
		
		System.out.println("-6>>>2: "+(-6>>>2));
		//-6:	1111 1111 1111 1111 1111 1111 1111 1010
		//右移2	0011 1111 1111 1111 1111 1111 1111 1110	右移后, 空位补全, >>>不分正负, 一律补0;
		
		//	>>就是除以2的右移次幂
		//	6>>3  等于6除以2的3次方, 就是 6/(2*2*2)
		
		
		
		System.out.println("6&3: "+(6&3));
		//与运算算法: 转换成2进制, 然后相同位与, 结果为真则是1, 假为0;只包括"有效位";
		//6:    0000 0000 0000 0000 0000 0000 0000 0110
		//3:    0000 0000 0000 0000 0000 0000 0000 0011
		//与		0000 0000 0000 0000 0000 0000 0000 0010 = 2
		
		
		System.out.println("6|3: "+(6|3));
		//或运算算法: 转换成2进制, 然后相同位或, 结果为真则是1, 假为0;只包括"有效位";
		//6:    0000 0000 0000 0000 0000 0000 0000 0110
		//3:    0000 0000 0000 0000 0000 0000 0000 0011
		//或		0000 0000 0000 0000 0000 0000 0000 0111 = 7
		
		
		System.out.println("6^3: "+(6^3));
		//异或运算算法: 转换成2进制, 然后相同位与, 结果为真则是1, 假为0, 然后取反;只包括"有效位";
		//6:    0000 0000 0000 0000 0000 0000 0000 0110
		//3:    0000 0000 0000 0000 0000 0000 0000 0011
		//与		0000 0000 0000 0000 0000 0000 0000 0010 = 7
		//取反	0000 0000 0000 0000 0000 0000 0000 0101 = 5
		
		
		
		System.out.println("~6: "+(~6));
		//反码运算算法: 转换成2进制, 然后相同位取反;包括"无效位"
		//6:    0000 0000 0000 0000 0000 0000 0000 0110
		//取反	1111 1111 1111 1111 1111 1111 1111 1001 =??? 
		
		//2进制中, 左数第一位是1表示是负数, 是0表示是正数;
		//计算上面2进制数字的10进制值: 首先-1, 然后取反, 然后加符号.
		//-1	1111 1111 1111 1111 1111 1111 1111 1000
		//取反	0000 0000 0000 0000 0000 0000 0000 0111 = 7;
		//加符号  = -7;
		
		
		
		
		int a = 6;
		int b = 3;
		System.out.println(a+" "+b);
		//交换2个数的值, 最常见的是再找一个变量中转, 简单, 易读;
//		int temp = 0;
//		temp = a;
//		a = b;
//		b = temp;
		
		
		//这是不需要引入第三个变量的方法, 但是此方法可能会溢出;
//		a = a+b;
//		b = a-b;
//		a = a-b;
		
		
		//这是不需要引入第三个变量, 且不会溢出的方法, 但是此方法不易读;
		a = a^b;
		b = a^b;
		a = a^b;
		
		System.out.println(a+" "+b);

	}

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值