什么都不说了, 狗眼已瞎.
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);
}
}