JAVA常见位运算(总结)

代码演示:

package com.lsj.test.lsj_pro.dataType.bitCalc;

public class TestBitCalc {

	public static void main(String[] args) {
		/*
		*		2 =======> 	00000000 00000000 00000000 00000010
		*		3 =======> 	00000000 00000000 00000000 00000011
		*/
		
		//		2&3======>	00000000 00000000 00000000 00000010, 结果是 :2
		System.out.println("2&3运算的结果是:"+andCalc(2, 3));
		//		2|3======>	00000000 00000000 00000000 00000011, 结果就是3
		System.out.println("2^3运算的结果是:"+orCalc(2,3));
		//		~2======>	11111111 11111111 11111111 11111101, 结果就是-3
		System.out.println("~2运算的结果是:"+versaCalc(2));
		//		2^3======>	00000000 00000000 00000000 00000001, 结果就是1
		System.out.println("2^3运算的结果是:"+eitherOrCalc(2,3));
		//		2<<3=====>	00000000 00000000 00000000 00010000, 结果是 :16
		System.out.println("2<<3运算的结果是:"+leftMove(2, 3));
		/*
		 * 5
		 * 
		 * 00000000 00000000 00000000 00000101	--原码
		 * 00000000 00000000 00000000 00000010	--右移(2)
		 * 00000000 00000000 00000000 00000010	--无符号右移(2)
		 */
		int a = 5;
		int a1 = righMove(a, 1);
		int a2 = unsignedRightMove(a, 1);
		System.out.println("5>>1运算的结果是:"+a1);	//2
		System.out.println("5>>>1运算的结果是:"+a2);	//2
		System.out.println(a1+"--"+a2); //2--2
		
		/*
		 * -5
		 * 
		 * 10000000 00000000 00000000 00000101  --原码(第一位为符号位,1表示为负数)
		 * 11111111 11111111 11111111 11111010  --反码(原码取反)
		 * 11111111 11111111 11111111 11111011  --补码(反码加1,这是-5的十进制表达)
		 * 
		 * 11111111 11111111 11111111 11111101  --右移(-3)(这是将-5的十进制右移后的十进制结果,也就是-3的十进制,可以看做是补码)
		 * 11111111 11111111 11111111 11111100  --右移(这是反码:补码减1)
		 * 10000000 00000000 00000000 00000011  --右移(-3)(这是原码:补码取反,这时候可以读出来为-3)
		 * 
		 * 01111111 11111111 11111111 11111101  --无符号右移(2147483645)
		 */
		int b = -5;
		int b1 = righMove(b, 1);
		int b2 = unsignedRightMove(b, 1);
		System.out.println("-5>>1运算的结果是:"+b1);
		System.out.println("-5>>>1运算的结果是:"+b2);
		System.out.println(b1+"--"+b2); //-3--2147483645
		
		/*
		 * 总结:
		 * 1.>> 需考虑符号位
		 * 2.>>> 不考虑符号位,缺少的位数补0
		 * 
		 */
		
	}
	
	
	/**
	 * 1.&(与运算) 针对二进制,只要有一个为0,就为0;
	 * 或者说:两个操作数中位都为1,结果才为1,否则结果为0
	 * @param a
	 * @param b
	 */
	public static int andCalc(int a, int b) {
		return a&b;
	}
	
	/**
	 * 2.|(或运算) 针对二进制,只要有一个为1,那么结果就是1,否则就为0
	 * @param a
	 * @param b
	 */
	public static int orCalc(int a, int b) {
		return a|b;
	}
	
	/**
	 * 3.~(非运算) 针对二进制,如果位为0,结果是1,如果位为1,结果是0
	 * @param a
	 */
	public static int versaCalc(int a) {
		return ~a;
	}
	
	/**
	 * 4.^(亦或运算) ,针对二进制,相同的为0,不同的为1
	 * @param a
	 * @param b
	 */
	public static int eitherOrCalc(int a, int b) {
		return a^b;
	}
	
	/**
	 * 5.<<(向左位移) 针对二进制,a转换成二进制后向左移动b位,后面用0补齐;
	 * 数学意义: 
	 * 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
	 * @param a
	 * @param b
	 */
	public static int leftMove(int a, int b) {
		return a<<b;
	}
	
	/**
	 * 6.>>(向右位移) 针对二进制,a转换成二进制后向右移动b位;
	 * 如果a是正数,空位补0;如果a是负数,空位补1
	 * 数学意义: 
	 * 右移一位相当于除2,右移n位相当于除以2的n次方。这里是取商哈,余数就不要了。	
	 * @param a
	 * @param b
	 */
	public static int righMove(int a, int b) {
		return a>>b;
	}
	
	/**
	 * 7.>>>(无符号右移)  无符号右移:
	 * 针对二进制,a转换成二进制后向右移动b位,忽略符号位,空位都以0补齐;
	 * 补充:
	 * 10进制转二进制的时候,因为二进制数一般分8位、 16位、32位以及64位 表示一个十进制数,所以在转换过程中,最高位会补零。
	 * 在计算机中负数采用二进制的补码表示,10进制转为二进制得到的是源码,将源码按位取反得到的是反码,反码加1得到补码
	 * 二进制的最高位是符号位,0表示正,1表示负。
	 * >>>与>>唯一的不同是它无论原来的最左边是什么数,统统都用0填充。
	 * @param a
	 * @param b
	 */
	public static int unsignedRightMove(int a, int b) {
		return a>>>b;
	}
	
}

如果有不恰当的地方,欢迎指正。

另外,这篇博主的文章总结的很好:https://blog.csdn.net/chijiandi/article/details/79022473

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值