Java位运算^,^=,|,|=,&,&=简述

背景

今天突然看到 java的类库java.util.regex.Pattern 里,第1344行内有这么一句

flags |= UNICODE_CASE

比较懵,不知道|=是什么意思。

解惑

| 与 |=

| 运算 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至于怎么得到的,可以看描述的内容,自己算一遍,加深印象(下面也是)。

^ 与 ^|

^ 运算 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

& 与 &|

& 运算 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

<< , >> 与 >>>

<<运算

<< 运算 位运算 左移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

71918cb0-d9f7-4331-82b6-5cf738df7551

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值