package com.sface.utils;
/**
* @className BitOperate
* @Desc 位运算
* << 带符号左移:二进制表示整体左移,低位(右边)补0
* >> 带符号右移:二进制表示整体右移,正数高位(左边)用0补齐,负数高位(左边)用1补齐(保持负数符号不变)
* <<< 无符号右移: 不存在这种写法,效果同<<
* >>> 无符号右移:无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位)
* &:按位与,二进制表示按位与,对应位两个都是1则结果为1,其他结果是0
* |:按位或,二进制表示按位或,对应位两个都是0则结果为0,其他结果是1
* ^:按位异或,二进制表示按位异或,从高位开始比较,如果相同则为0,不相同则为1
* ~:按位非,二进制表示按位非,如果位为0,结果是1,如果位为1,结果是0.
* 负数二进制表示:Java负数存储是以补码形式存储的(补码=反码+1)
* @Author HZ
* @Date 2019/7/26 11:09
* @Version 1.0
*/
public class BitOperate {
public static void main(String[] args){
bitShow(10);
System.out.println();
unSignLeftMove(10);
System.out.println();
unSignLeftMove(-10);
System.out.println();
unSignRightMove(10);
System.out.println();
unSignRightMove(-10);
System.out.println();
signRightMove(10);
System.out.println();
signRightMove(-10);
System.out.println();
bitAnd(3, 5);
System.out.println();
bitOr(3, 5);
System.out.println();
bitDiffOr(3, 5);
}
/**
* @title bitShow 二进制表示
* @Description 负数二进制表示:Java负数存储是以补码形式存储的(补码=反码+1)
* 10的二进制是1010,它的反码就是0101,再加1就是补码0110。
* int型在Java中占8个字节,刚好32位,10原码的高位全是0,它的反码自然高位就变成了1。
* @Author HZ
* @Param [i]
* @Return void
* @Date: 2019/7/26 11:27
*/
private static void bitShow(int num) {
if(num < 0){
num = - num;
}
System.out.println("正数二进制=" + Integer.toBinaryString(num) +", 负数二进制(补码=反码+1)=" + Integer.toBinaryString(-num));
}
/**
* @title unSignLeftMove
* @Description <<,带符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。
* @Author HZ
* @Param
* @Return
* @Date: 2019/7/26 11:13
*/
public static void unSignLeftMove(int num){
System.out.println("十进制=" + num +", 二进制=" + Integer.toBinaryString(num));
int newNum = num << 2;
System.out.println("<<2即带符号左移2位后 十进制=" + newNum +", 二进制=" + Integer.toBinaryString(newNum));
}
/**
* @title unSignRightMove
* @Description >>,带符号左移位,将运算数的二进制整体右移指定位数,正数高位用0补齐,负数高位用1补齐(保持负数符号不变)。
* @Author HZ
* @Param
* @Return
* @Date: 2019/7/26 11:13
*/
public static void unSignRightMove(int num){
System.out.println("十进制=" + num +", 二进制=" + Integer.toBinaryString(num));
int newNum = num >> 2;
System.out.println(">>2即带符号右移2位后 十进制=" + newNum +", 二进制=" + Integer.toBinaryString(newNum));
}
/**
* @title signRightMove
* @Description >>>,无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位)
* @Author HZ
* @Param
* @Return
* @Date: 2019/7/26 11:13
*/
public static void signRightMove(int num){
System.out.println("十进制=" + num +", 二进制=" + Integer.toBinaryString(num));
int newNum = num >>> 2;
System.out.println(">>>2即无符号右移2位后 十进制=" + newNum +", 二进制=" + Integer.toBinaryString(newNum));
}
/**
* @title bitAnd
* @Description &:按位与,二进制表示按位与,对应位两个都是1则结果为1,其他结果是0
* @Author HZ
* @Param
* @Return
* @Date: 2019/7/26 11:13
*/
public static void bitAnd(int num1, int num2){
System.out.println("十进制=" + num1 +", 二进制=" + Integer.toBinaryString(num1));
System.out.println("十进制=" + num2 +", 二进制=" + Integer.toBinaryString(num2));
System.out.println("&即按位与---"+num1+"&"+num2+"="+(num1&num2));
}
/**
* @title bitOr
* @Description |:按位或,二进制表示按位或,对应位两个都是0则结果为0,其他结果是1
* @Author HZ
* @Param
* @Return
* @Date: 2019/7/26 11:13
*/
public static void bitOr(int num1, int num2){
System.out.println("十进制=" + num1 +", 二进制=" + Integer.toBinaryString(num1));
System.out.println("十进制=" + num2 +", 二进制=" + Integer.toBinaryString(num2));
System.out.println("|即按位或---"+num1+"|"+num2+"="+(num1|num2));
}
/**
* @title bitOr
* @Description ^:按位异或,二进制表示按位异或,从高位开始比较,如果相同则为0,不相同则为1
* @Author HZ
* @Param
* @Return
* @Date: 2019/7/26 11:13
*/
public static void bitDiffOr(int num1, int num2){
System.out.println("十进制=" + num1 +", 二进制=" + Integer.toBinaryString(num1));
System.out.println("十进制=" + num2 +", 二进制=" + Integer.toBinaryString(num2));
System.out.println("^即按位或---"+num1+"^"+num2+"="+(num1^num2));
}
}