1 - 背景
今天突然看到 java的类库java.util.regex.Pattern
里,第1344行内有这么一句
flags |= UNICODE_CASE
比较懵,不知道|=
是什么意思。
2 - 解惑
2.1 | 与 |=
| 运算 0|1=1, 1|0=1, 0|0=0, 1|1=1
a|=b 即是将 a|b 的值重新赋值给 a
int a = 0b0101;
int b = 0b1100;
a |= b;
System.out.println(a);
System.out.println(0b1101);
a最终的结果便是 0b1101
,至于怎么得到的,可以看描述的内容,自己算一遍,加深印象(下面也是)。
2.2 ^ 与 ^|
^ 运算 0^1=1, 1^0=1, 0^0=0, 1^1=0
a^=b 即是将 a^b 的值重新赋值给 a
a = 0b0101;
b = 0b1100;
a ^= b;
System.out.println(a);
System.out.println(0b1001);
a的结果=0b1001
2.3 & 与 &|
& 运算 0&1=0, 1&0=0, 0&0=0, 1&1=1
a&=b 即是将 a&b 的值重新赋值给 a
a = 0b0101;
b = 0b1100;
a &= b;
System.out.println(a);
System.out.println(0b0100);
a的结果=0b0100
2.4 << , >> 与 >>>
<<运算
<< 运算 位运算 左移xx位
a<<b 将a的二进制左移b位,右边空位补0
a<<=b 即 a = a<<b , a = a * Math.pow(2, b)
a << b 实际上是将a的二进制位左移b位,空位补0。怎么算呢 ? 简单想一下,假如说a是一个十进制数,左移2位,是不是将a * (10的二次方),左移3位是不是将a * (10的三次方) ?
那么放在二进制数a上,a=0b11000111
, 左移b位,b= 3
, 于是0b11000111
左移3位后 = 0b11000111000
正数的情况
int a = 199;
int b = 3;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a<<b));
11000111
11000111000
负数的情况
int a = -199;
int b = 3;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a<<b));
11111111111111111111111100111001
11111111111111111111100111001000
>>运算
>> 运算 位运算 右移xx位
a>>b 将a的二进制右移b位,即a的二进制减位。若a是负数,则左边空位补1,若a是正数,则左边空位补0
负数的情况
int a = -199;
int b = 3;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>b));
11111111111111111111111100111001
11111111111111111111111111100111
正数的情况
int a = 199;
int b = 3;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>b));
11000111
11000
>>>运算
>>> 运算 位运算 无符号右移xx位
a>>>b 将a的二进制右移b位,即a的二进制减位。不管a是正数还是负数,左边空位一律补0
无符号右移运算,看上一小节>>
是需要区分正数负数的,而>>>
是不需要分正数和负数的。也就是说不管被位运算的数是正数还是负数,都是减位操作,左边空位一律补0。
正数的情况
int a = 199;
int b = 3;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>>b));
11000111
11000
负数的情况
int a = -199;
int b = 3;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>>b));
11111111111111111111111100111001
11111111111111111111111100111
本章完。