1、位运算
1.1 原码、反码、补码
- 计算机中所有数据的存储和运算都是以二进制补码的形式进行的。
- a —> 97,A —> 65,‘0’ —> 48
- 举例:5和-5,Java中int类型的数占4个字节,由于1字节(Byte)=8位(bit),所以int类型的数共占32位。其中第1位是符号位,该位为0表示正数,为1表示负数。其余31位是数值位。
- 原码:
5: 0000 0000 0000 0000 0000 0000 0000 0101
-5:1000 0000 0000 0000 0000 0000 0000 0101 - 反码:
5: 0000 0000 0000 0000 0000 0000 0000 0101
-5:1111 1111 1111 1111 1111 1111 1111 1010 - 补码:
5: 0000 0000 0000 0000 0000 0000 0000 0101
-5:1111 1111 1111 1111 1111 1111 1111 1011
- 原码:
- 结论:
- 正数的原码、反码、补码都是一样的。
- 负数的原码:把正数原码的第一位(符号位)0变成1。
- 负数的反码:把负数原码的符号位不变,数值位取反(0变成1,1变成0)。
- 负数的补码:负数反码加上1。
- 0: 0000 0000 0000 0000 0000 0000 0000 0000
- -0:1000 0000 0000 0000 0000 0000 0000 0000
1.2 位运算符
- Java中的位运算符一共有7个:
符号 | 含义 |
---|---|
& | 按位与,and。两个数字相同位上,同1为1,一0为0 |
| | 按位或,or。两个数字相同位上,一1为1,同0为0 |
^ | 按位异或,xor。两个数字相同位上,相同为0,不同为1 |
~ | 按位取反,not。1变为0,0变为1 |
<< | 左移,shl。a << b表示把a的二进制数左移b位,最右边空出的b位用0补充。运算结果相当于a乘以2的b次方 |
>> | 右移,shr。a >> b表示把a的二进制数右移b位,即去掉末尾的b位,最左边的b位补上原来的符号位(正数为0,负数为1)。若a为正数,运算结果相当于a除以2的b次方 |
>>> | 无符号右移。a >>> b表示把a的二进制数右移b位,即去掉末尾的b位,最左边的b位补上0(无论正负都补0) |
int a = 5; // 0000 0000 0000 0000 0000 0000 0000 0101
int b