java (&=、|=、^=、~)运算符

java (&=、|=、^=、~)运算符

一、介绍

​ 在学习hashMap的源码里有一个获取容器大小的函数。身为一名初学者,对以下用法充满了好奇,于是或去网上搜索了一下这是个什么东西,并且分享一下笔者的心得,为了将来忘记的时候能拿出来熟悉一下,也为了跟笔者一样遇到同样问题的人。

static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 
        : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

二、例子讲解

​ 以下例子笔者定义了一个初始大小为7的int类型变量。并且计算如下表达试 cap |= cap >>> 1;,首先将cap变量通过位移运算符向左边移动一位。将位移运算过后的cap变量与未运算的cap变量进行或运算比较,并且打印结果。

public static void main(String[] args) {
    // 定义一个int值为7的变量
    // 7 的二进制为 0111
    int cap = 7;
    // 1、将 cap变量的转为二进制无符号向左移动一位 得到的二进制结果为 0011 ,转换成十进制为 3
    // 2、将原来的cap变量 与进行位运算之后的cap变量进行比较
    // 3、对 0111 与 0011 进行或运算,并且得到结果的二进制为 0111,转换为十进制为 7
    cap |= cap >>> 1;
    System.out.println(cap); // 打印结果为 7
}

三、扩展

​ 在java中除了以上运算符外还有许多的运算符,比如:或运算符、与运算符、异或运算符、取反运算符等。以下对几种基本的运算符进行介绍。

1、与运算(&=)

    public static void main(String[] args) {
     // 定义一个int值为7的变量
     // 7 的二进制为 0111
     int cap = 7;
     // 1、将 cap变量的转为二进制无符号向左移动一位 得到的二进制结果为0011 ,转换成十进制为 3
     // 2、将原来的cap变量 与进行位运算之后的cap变量进行比较
     // 3、比如二进制比较的第1位(从右往左数),同时为1和1,在这种情况下,与运算会返回 true(1)
     // 4、比如二进制比较的第3位(从右往左数),同时为1和0,在这种情况下,与运算会返回 false(0)
     // 5、对 0111 与 0011 进行与运算,并且得到结果的二进制为 0011,转换为十进制为 3
     cap &= cap >>> 1;
     System.out.println(cap); // 打印结果为 3
    }

2、或运算(|=)

PS: 或运算只有任何一方成立,返回结果都为true,只有双方都不成立才返回false

public static void main(String[] args) {
    // 定义一个int值为7的变量
    // 7 的二进制为 0111
    int cap = 7;
    // 1、将 cap 变量进行相加运算 7 + 3 = 10,转为十进制为 1010
    // 2、将原来的cap变量 与进行相加运算之后的cap变量进行比较
    // 3、比如:二进制位比较第1位(从右往左数)分别为0和1,此时或运算会返回 true(1)
    // 4、只有同时为0的时候,或运算才会返回 false(0)
    // 5、对 0111 与 1010 进行或运算,并且得到结果的二进制为 1111,转换为十进制为 15
    cap |= cap + 3;
    System.out.println(cap); //打印结果为 15
}

3、异或运算符(^=)

PS: 异或运算符当且仅当操作数不同时才返回 true

public static void main(String[] args) {
  // 定义一个int值为4的变量
  // 4 的二进制为 0100
  int cap = 4;
  // 1、将 cap 变量进行相加运算 4 + 2 = 6,转为十进制为 0110
  // 2、将原来的cap变量 与进行相加运算之后的cap变量进行比较
  // 3、比如二进制比较的第1位(从右往左数),同时为0和0,在这种情况下,异或运算会返回 false(0)
  // 4、二进制比较的第2位(从右往左数),分别为0和1,这种情况下,异或运算会返回 true(1)
  // 5、二进制比较的第3位(从右往左数),同时为1和1,在这种情况下,异或运算会返回 false(0)
  // 6、对 0100 与 0110 进行异或运算,并且得到结果的二进制为 0010,转换为十进制为 2
  cap ^= cap + 2;
  System.out.println(cap); //打印结果为 2
    }

4、取反运算(~)

关于取反运算这块笔者借鉴了别的文章。(16条消息) Java篇—取反(~)操作符的应用及理解_不吃猫的鱼c的博客-CSDN博客

public static void main(String[] args) {
    // 定义一个int值为4的变量
    // 4 的二进制为 0100
    int cap = 4;
    //1、 对4的二进制进行取反操作
    //2、 所有的数据都是以补码的形式进行展示的
    //3、 4 的原码为 00000000 00000000 00000000 00000100
    //4、 4 的反码为 11111111 11111111 11111111 11111011
    //5、 4 的补码为 10000000 00000000 00000000 00000101 
    //6、 根据以上运算可得出结果为 -5 
    cap = ~cap;
    System.out.println(cap); //打印结果为 -5
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值