二进制运算专题 — java中常用的二进制运算

前言:

在看HashMap 源码时发现,HashMap 的 put 方法中用到了位运算,与运算,异或运算等二进制运算。对于这种平时不常用的知识点,很容易遗忘。同时在看java技术栈相关源码时也会发现有大量的二进制运算,所以写这篇博客的目的就是整理出java技术中常用的二进制运算,一方面方便自己查阅和积累,另一方面也想分享给那些刚好看到这篇博文的同学,希望能帮助到你。

注意:java中所有的二进制操作符都是操作数字的补码(既:十进制转换为二进制) 

& (与运算符)

1.特点:二元操作符,操作两个二进制数据;两个二进制数最低位对齐,只有当两个对位数都是1时才为1,否则为0
2.案例:
    int a = 3 & 2 ; 
    System.out.println(a); //结果为 2 
3.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011
    2的二进制补码表示为:
        00000000 00000000 00000000 00000010
    运算:3 & 2 
        00000000 00000000 00000000 00000011
    &   00000000 00000000 00000000 00000010
    -------------------------------------------
        00000000 00000000 00000000 00000010            二进制是2

| (或运算符)

1.特点:二元操作符,操作两个二进制数据;两个二进制数最低位对齐,当两个对位数只要有一个是1则为1,否则为0
2.案例:
    int a = 3 | 2 ; 
    System.out.println(a); //结果为 3 
3.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011
    2的二进制补码表示为:
        00000000 00000000 00000000 00000010
    运算:3 | 2 
        00000000 00000000 00000000 00000011
    |   00000000 00000000 00000000 00000010
    -------------------------------------------
        00000000 00000000 00000000 00000011            该补码对应十进制为3  

^ (异或运算符)

1.特点:二元操作符,操作两个二进制数据;两个二进制数最低位对齐,只有当两个对位数字不同时为1,相同为0
2.案例:
    int a = 3 ^ 2 ; 
    System.out.println(a); //结果为 1 
3.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011
    2的二进制补码表示为:
        00000000 00000000 00000000 00000010
    运算:3 ^ 2 
        00000000 00000000 00000000 00000011
    ^   00000000 00000000 00000000 00000010
    -------------------------------------------
        00000000 00000000 00000000 00000001           该补码对应十进制为1 

~ (非运算符)

1.特点:一元操作符,
2.规则:非运算即取反运算,在二进制中1变0,0变1
3.案例:
    int a = ~ 2 ; 
    System.out.println(a); //结果为 -3
4.分析:
     2的二进制补码表示为:
        00000000 00000000 00000000 00000010
     运算:
      ~     00000000 00000000 00000000 00000010
    ------------------------------------------
         11111111 11111111 11111111 11111101   //该补码对应十进制为:-3

<<(左移运算符)

1.形式: m << n 
2.特点:二元操作符,m数字二进制向左移动n位的结果;结果相当于: m*(2的n次方)
3.案例:
    int a = 3 << 2 ; 
    System.out.println(a); //结果为 12 
4.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011

    运算:3 << 2 
            00000000 00000000 00000000 00000011
    << 2    
    -------------------------------------------
            00000000 00000000 00000000 00001100            该补码对应十进制为12 

>> (右移运算符)

1.形式: m >> n 
2.特点:二元操作符,m数字二进制向右移动n位的结果;结果相当于: m / (2的n次方);
正数左补0,负数左补1.
3.案例:
    int a = 3 >> 2 ; 
    System.out.println(a); //结果为 0 
4.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011

    运算:3 >> 2 
            00000000 00000000 00000000 00000011
    >> 2    
    -------------------------------------------
            00000000 00000000 00000000 00000000           该补码对应十进制为0
5.注意: 最后的11向右移动两位,正好补上左边补上0; 所以结果为0 

>>> (无符号右移运算符)

1.二元操作符
2.特点:它使用0扩展,无论正负都在最高位补0 
3.案例:
    int a = 3 >>> 2 ; 
    System.out.println(a); //结果为 0 
4.分析:
    3的二进制补码表示为:
        00000000 00000000 00000000 00000011
    运算:
        00000000 00000000 00000000 00000011
    >>>2
    ------------------------------------------
        00000000 00000000 00000000 00000000        该补码对应十进制为0

<<< (无符号左移运算符)

不好意思二进制没有无符号左移运算。

注意:

位运算中左移跟符号没有关系的, 因为最高位就是符号位
例如8位的byte中最高位如果是 1那就表示负数 如果是左移一位, 
那么最高位就会丢掉, 最低位补0 1111 1111 << 1 就会变成 1111 1110

结语:

以上就是关于java中常用的二进制运算,值得一提的是。形如:HashMap 中为何将数组的 

DEFAULT_INITIAL_CAPACITY 默认值设为 1 << 4 而不是直接赋值为 16呢,不就是因为左移运算比赋值运算更快嘛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值