Javase学习10-位运算符
Javase学习10-位运算符
位运算符本质都是针对二进制数0和1进行运算的,在使用位运算符时,会先将操作数转换成二进制进行位运算,再将结果转换成想要的进制数。1表示true,0表示false
须知:
- 负数在内存中是以补码的形式存储的
- 负数的二进制数就是该负数对应正数的源码全部取反加1得到的补码
- 原码: 00011110
- 反码: 11100001
- 补码: 11100010
- 负数的源码就是补码除符号位外全部取反加1
- 补码:11110011
- 反码:10001100
- 原码:10001101
一、位运算符分类
运算符 | 运算 | 例子 | 运算过程 |
---|---|---|---|
& | 位与 | a & b | a和b每一位进行"与"操作,相同的为1,不同的为0 |
| | 位或 | a | b | a和b每一位进行"或"操作,只有a与b之间有一个1就为1 |
~ | 位取反 | ~a | 将a每一位进行"非"操作,所有位数字取反 |
^ | 位异或 | a ^ b | a和b每一位进行"异或"操作,相同的为0,不同的为1 |
<< | 左移 | a << b | 将a左移b位,右边空位用0填充 |
>> | 右移 | a >> b | 将a右移b位,丢弃被移出位,左边最高位为1空位就填充1,为0就填充0 |
>>> | 无符号右移 | a >>> b | 将a右移b位,丢弃被移出位,左边空位都用0填充 |
二、实例:
1. &:位与
将a和b的每一位都进行“与”操作,相同的为1,不同的为0
int a = 2;
int b = 3;
/**
* a与b都是32位的,但有效数字都在最后8位,故下面在计算过程中都只显示后8位
* a转换成二进制:00000010 2
* b转换成二进制:00000011 3
* ----------------------------
* 位与运算结果: 00000010 2
*/
System.out.println(a & b);
2. |:位或
a和b每一位进行"或"操作,只要a与b之间有一个1就为1
int a = 2;
int b = 3;
/**
* a转换成二进制: 00000010 2
* b转换成二进制: 00000011 3
* ----------------------------
* 按位或运算结果: 00000011 3
*/
System.out.println(a | b);
3. ~:取反
将a每一位进行"非"操作,所有位数字取反
int a = 2;
/**
* a转换成二进制: 00000010 2
* ----------------------------
* 按位取反运算结果: 11111101(补码) -3
*/
System.out.println(~ a);
4. ^:位异或
a和b每一位进行"异或"操作,相同的为0,不同的为1
int a = 2;
int b = 3;
/**
* a转换成二进制: 00000010 2
* b转换成二进制: 00000011 3
* ----------------------------
* 按位异或运算结果: 00000001 1
*/
System.out.println(a ^ b);
5. <<:左移
将a左移b位,右边空位用0填充
int a = 2;
int b = 3;
/**
* a转换成二进制: 00000010 2
* ----------------------------
* a左移3位后运算结果: 00010000 16
*/
System.out.println(a << b);
6. >>:右移
将a右移b位,丢弃被移出位,左边最高位为1空位就填充1,为0就填充0
int a = 98;
/**
* a转换成二进制: 01100010 98
* ----------------------------
* a右移2位后运算结果: 00011000 24
*/
System.out.println(a >> 2);
int b = -30;
/**
* b转换成二进制: 11100010(补码) -30
* ----------------------------
* b右移2位后运算结果: 11111000 -8
*/
System.out.println(b >> 2);
7. >>>:无符号右移
将a右移b位,丢弃被移出位,左边空位都用0填充
int a = 98;
/**
* a转换成二进制: 01100010 98
* ----------------------------
* a右移2位后运算结果: 00011000 24
*/
System.out.println(a >>> 2);
int b = -30;
/**
* 负数进行无符号右移后就会变成一个正数,故有效数字从最高位算起
* b转换成二进制: 11111111111111111111111111100010(补码) -30
* -----------------------------------------------------------
* b右移2位后运算结果: 00111111111111111111111111111000 1073741816
*/
System.out.println(b >>> 2);