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
}