package 位运算;
//在处理整型数值时,可以直接对组成整形数值的各个位进行操作这意味着可以使用屏蔽技术获得整数中的各个位(??)
//按位与的功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为1时,结果位才为1。
//&(按位与)、|(按位或)、^(按位异或)、~(非/取反)
//>>和<<运算符将二进制位进行右移或者左移操作
//>>>运算符将用0填充高位;>>运算符用符号位填充高位;没有<<<运算符
//对于int型(32位),1<<35与1<<3是相同的(移32位,对右侧的数取模32),而左边的操作数是long型时需对右侧操作数模64
//与:都为1,结果为1;或:有一个为1,结果为1;异或:二者不同时结果为1
//我们对一个数进行位运算的时候,是在这个数的补码上进行的
//位运算的奇巧淫技:
public class TestWei {
public static void main(String[] args) {
//判断一个数的奇偶数
int num = 86;
System.out.println(num+"是:"+(((num & 1) == 0?"偶数":"奇数")));
//获取二进制位是1还是0(两种解决方案)
//法一:左移后复位
System.out.println( num+" 的第5位上的二进制数是:"+(((num & (1<<4))>>4)==0?"0":"1"));
//法二:右移
System.out.println( num+" 的第5位上的二进制数是:"+((((num>>4)&1)==0)?"0":"1"));
System.out.println("num = "+num);
//交换两个整数变量的值
int A = 10;
int B = 20;
A = A^B;//A=A^B
B = A^B;//B=(A^B)^B=A
A = A^B;//A+(A^B)^A=B
System.out.println("A == " + A + "\n" + "B == " + B);
//不用判断语句,求整数的绝对值
int num2 = -20;
System.out.println(num2+"的绝对值是: "+(( num2^(num2>>31))+(num2>>>31)));
//负数的补码为取反加一,若num2为负数,(num2>>31是-1),与-1做异或相当于取反;
//正数的补码是他本身,若num2为正数,(num2>>31是0),与0做异或等于它本身
//异或,可以理解为不进位加法:1+1=0,0+0=0,1+0=1,0+1=1
//性质:
//1.交换律,可任意交换运算因子的位置,结果不变
//2.结合律:(即(a^b)^c == a^(b^c))
//3.对于任何数x,都有x^x=0,x^0=x,同自己求异或为0,同0求异或为自己
//4.自反性:a^b^b=a^0=a,连续和同一个因子做异或运算,最终结果为自己
}
}