最近在阅读Java和Android官方源码,发现里面很多代码都涉及到位运算,我看得很懵逼。今天就抽点时间总结Java位运算基本用法。
1、准备知识
了解计算机二进制基础概念。
2、基本类型占用字节
基本类型 | 基本类型字节 | 包装类 |
---|---|---|
byte | 1 | Byte |
boolean | 1或4 | Boolean |
short | 2 | Short |
char | 2 | Character |
int | 4 | Integer |
float | 4 | Float |
long | 8 | Long |
double | 8 | Double |
3、位运算符
由上面可知byte在内存中占用1个字节(8位bit),定义如下
byte a=60;//0011 1100
byte b=13;//0000 1101
操作符 | 描述 | 移动过程 | 样例 | 二元运算 |
---|---|---|---|---|
&(与) | 如果相对应位都是1,则结果为1,否则为0 | ![]() | A&B=12 | 是 |
︱(或) | 如果相对应位都是0,则结果为0,否则为1 | ![]() | A︱B=61 | 是 |
~(非) | 取反运算符翻转操作数的每一位,即0变1,1变0 | ![]() | ~A=-61 | 否 |
^(异或) | 如果相对应位值相同,则结果为0,否则为1 | ![]() | A^B=49 | 是 |
<<(左移运算符) | 右边的2表示A要左移两位。 | ![]() | A<<2=240 | 是 |
>>(右移运算符) | 右边的2表示A要右移两位。 | ![]() | A>>2=15 | 是 |
>>>(右移补零运算符) | 右边的3表示A要右移三位,移动的空位以零填充。 | ![]() | A>>>3=7 | 是 |
明白以上的计算过程,代码就很简单了,随便贴一下。
System.out.println(a & b);//位与操作,值为12
System.out.println(a | b);//位或操作,值为61
System.out.println(~a);//位非操作,值为-61
System.out.println(a ^ b);//位异或操作,值为49
System.out.println(a << 2);//左位移操作,值为240
System.out.println(a >> 2);//右位移操作,值为15
System.out.println(a >>> 3);//无符号右位移操作,值为7