欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA常见位运算(总结)

程序员文章站 2022-07-15 14:29:14
...

代码演示:

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 00000001, 结果就是1
		System.out.println("2^3运算的结果是:"+orCalc(2,3));
		//		2&3======>	00000000 00000000 00000000 00000010, 结果是 :2
		System.out.println("2&3运算的结果是:"+andCalc(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 = varRightMove(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 = varRightMove(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,不同的为1
	 * @param a
	 * @param b
	 */
	public static int orCalc(int a, int b) {
		return a^b;
	}
	
	/**
	 * 2.&(与运算) 针对二进制,只要有一个为0,就为0
	 * @param a
	 * @param b
	 */
	public static int andCalc(int a, int b) {
		return a&b;
	}
	
	/**
	 * 3.<<(向左位移) 针对二进制,a转换成二进制后向左移动b位,后面用0补齐;
	 * 数学意义: 
	 * 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
	 * @param a
	 * @param b
	 */
	public static int leftMove(int a, int b) {
		return a<<b;
	}
	
	/**
	 * 4.>>(向右位移) 针对二进制,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;
	}
	
	/**
	 * 5.>>>(无符号右移)  无符号右移:
	 * 针对二进制,a转换成二进制后向右移动b位,忽略符号位,空位都以0补齐;
	 * 补充:
	 * 10进制转二进制的时候,因为二进制数一般分8位、 16位、32位以及64位 表示一个十进制数,所以在转换过程中,最高位会补零。
	 * 在计算机中负数采用二进制的补码表示,10进制转为二进制得到的是源码,将源码按位取反得到的是反码,反码加1得到补码
	 * 二进制的最高位是符号位,0表示正,1表示负。
	 * >>>与>>唯一的不同是它无论原来的最左边是什么数,统统都用0填充。
	 * @param a
	 * @param b
	 */
	public static int varRightMove(int a, int b) {
		return a>>>b;
	}
	
}

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

相关标签: 位运算