Java基础教程:位运算符(&,|,^,~,<<,>>,>>>)

开课吧开课吧锤锤2021-07-22 11:41

程序中的整数,在计算机内存中都是以二进制的形式存储的。位运算是直接对二进制位进行操作,自然在性能和速度上有天生的优越性。  

Java基础教程

位运算符主要包括:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)、>>>(无符号右移)。  

接下来,那我们逐个对比分析。  

汇总对比:  

(字体高亮者为常用运算符)  

含义
运算符
Java
二进制运算
自我理解
按位与
a&b 3 & 2 0011&0010 = 0010= 2 同位,相乘
按位或
a | b 3 | 2

0011|0010 = 0011

= 3

同位,有1为1
按位异或
a ^ b 3 ^ 2

0011^0010 = 0001

=1

同位,不同为1
按位取反 ~ a ~ 3

~0011= -4;

1....1100

1变0,0变1;

~a = -a - 1;

~3 = -3 - 1;

左移
a << b 3 << 2

0011=1100=12;

a*(2的b次方)

a向左移动b位

右移
a >> b 3 >> 2

0011=0000=0;

a/(2的b次方)取整

a向右移动b位;

正数补0,负数补1

无符号右移
a >>> b
3 >>> 2

0011=0000=0;

a/(2的b次方)取整

a向右移动b位;

不管正数,均补0

代码实操  

/**
 * @author jaylee
 * @description:
 * @author: Mr.JayLee
 * @create: 2020-04-18 17:02
 */
public class Main {
  public static void main(String[] args) {
    // 十进制转二进制 | 12 -> 1100
    System.out.println(Integer.toBinaryString(12));//1100
    // 二进制转十进制 | 1100 -> 12
    System.out.println(Integer.parseInt("1100", 2));//12
    
    // 十六进制转十进制 | FF -> 255
    System.out.println(Integer.parseInt("FF", 16));//255
    // 十六进制转十进制 | FF -> 255
    System.out.println(Integer.valueOf("FF", 16)); //255 todo // 底层也是调用了parseInt
    // 十进制转十六进制 | 255 -> ff
    System.out.println(Integer.toHexString(255));//ff
    
    System.out.println("==========================");
    
    
    /**
     *  todo  a & b  同1为1,其余为0。
     *
     *          自我理解 :todo 【同位相乘】
     *
     *  1、与 ( & ) 运算  todo( & 符合 乘法规则 )
     *
     *      00011
     *  &   00010
     * -----------
     *      00010 = 2
     * */
    System.out.println(3 & 2);//2
    
    
    /**
     *
     *  todo  a | b  有1为1。
     *
     *          自我理解 :todo 【同位相加】
     *
     *  2、或 ( | ) 运算 todo( | 符合 加法规则 )
     *
     *      00011
     *  |   00010
     * -----------
     *      00011 = 3
     * */
    System.out.println(3 | 2);//3
    
    
    /**
     *
     *  todo  a ^ b  不同为1,相同为0。
     *
     *          自我理解:todo 【同位相减,取绝对值】减法规则
     *
     *  3、异或 ( ^ ) 运算  todo( | 符合  |减法规则| )
     *
     * 0 ^ 1 = 1
     * 1 ^ 1 = 0
     * 0 ^ 0 = 0
     * 1 ^ 0 = 1
     *
     *         3 ^ 2运算
     *
     *      *      00011
     *      *  ^   00010
     *      * -----------
     *      *      00001 = 1
     *
     * */
    System.out.println(3 ^ 2);//1
    
    
    /**
     *
     *  todo  ~ a  非a,0变1,1变0。
     *
     *          自我理解:todo 【 ~ a = -a - 1 】
     *
     *  4、按位取反 ( ~ ) 运算  todo( ~ 符合 : 同位取反 ; ~ a = -a - 1; )
     *
     * 计算过程
     * 3的源码:        00000011
     * 对3的原码取反:   11111100  补码 (结果即为 -4 的补码[计算机中带符号的整数都是采用二进制的补码进行存储])
     * 转反码:         11111011 (补码减1)
     * 转原码:         10000100 (符号位不变, 其他位取反) = -4
     *
     *  todo ~x = -x - 1
     *  todo ~3 = -3 - 1 = -4
     * */
    System.out.println(~3);//-4
    
    
    /**
     *
     *   todo  a << b  左移b位
     *
     *         自我理解:【
     *                      左移n位,按10进制,相当于扩大10^n倍 ;
     *                          todo 位运算 左移,和10进制如法炮制,相当于 扩大 2^n 倍
     *                    】
     *
     *  5、左移( << )运算  todo ( a * (2 ^ b))  扩大 b 倍
     *
     *          00011
     * 左移2位   01100 = 12
     * */
    System.out.println(3 << 2);//12
    
    
    /**
     *
     *    todo  a >> b  a右移b位
     *
     *          自我理解:【
     *                      右n位,按10进制,相当于缩小10^n倍 ;
     *                             todo 位运算 右移,和10进制如法炮制,相当于 缩小 2^n 倍
     *                    】
     *
     *  6、有符号右移 ( >> ) 运算  todo (  a * / (2 ^ b) )  缩小 b 倍
     *
     *          00011
     * 右移2位     000
     *          -----
     *       todo   符号位为0,表示原数是正数,右移之后,高位补0;
     *       todo   符号位为1,表示原数为负数,右移之后,则高位补1。
     *
     *         原数为正数,则 最后 高位补0
     *
     *          -----
     *          00000
     *
     * */
    System.out.println(3 >> 2);//0
    
    
    /**
     *
     *    todo  a >>> b  a无符号右移b位
     
     *          自我理解:【
     *                      右n位,按10进制,相当于缩小10^n倍 ;
     *                             todo 位运算 右移,和10进制如法炮制,相当于 缩小 2^n 倍
     *                    】
     *
     *  7、无符号右移 ( >>> ) 运算  todo (  a * / (2 ^ b) )  缩小 b 倍
     *
     *               11111111111111111111111111111101
     * 无符号右移2位     111111111111111111111111111111 todo(无符号右移2位,相当于从右向左移除2位)
     *               --------------------------------
     *
     *      todo   不管原来数字是正是负,高位补0
     *               --------------------------------
     *               00111111111111111111111111111111 = 1073741823
     *
     * */
    System.out.println(-3 >>> 2);//1073741823
    
  }
  
}

总结:  

1、&:相当于同位相乘。  

2、|:相当于同位相加。  

3、^:相当于同位不同为1,同位为0,(同位相减,取绝对值)。  

4、~:相当于同位取反(公式:~a=-a-1)。  

5、<<:左移运算(a*(2^b))。  

6、>>:右移运算(a*/(2^b))缩小b倍。  

7、>>>:无符号右移运算(a*/(2^b))缩小b倍。  

无符号右移,正数右移  处理结果一致;

左移运算、右移运算,都是有符号 位移动运算(详情见代码分析)。

以上就是开课吧广场小编为大家整理发布的“Java基础教程:位运算符(&,|,^,~,<<,>>,>>>)”一文,更多Java教程相关内容尽在开课吧Java教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享