Java的位运算
date
Feb 14, 2019
slug
Java的位运算
status
Published
tags
Java
summary
type
Post
- Java的位运算有6种
- << 左移
- >> 右移
- & 位与,按位去与运算
- | 位或,按位取或运算
- ~ 位非,每位按位取反
- ^ 位异或,按位计算,相同位0,不同为1
- 负数在计算机中以补码的形式存在,正数补码=原码,负数补码=绝对值的反码+1
- 5 :正数直接用原码表示
00000000 00000000 00000000 00000101
- -5: 先算出5的反码
11111111 11111111 11111111 11111010
,反码+1得出-5的补码11111111 11111111 11111111 11111011
以下是int类型数的储存形式:
- 最高位是符号位,0代表正数,1代表负数,符号位也参与运算;
- 运算结果最高位为0时,结果就是原码,例如:位运算后结果是
00000000 00000000 00000000 00000001
那么结果就是1; - 运算结果最高位是1,那么运算结果是补码,需要求得原码,例如,运算结果是
11111111 11111111 11111111 11111110
,最高位是1,是负数,减一得到11111111 11111111 11111111 11111101
,位反转得到原码00000000 00000000 00000000 00000010
,最后得到运算结果是-2
- 其中右移又分 有符号右移
>>
和 无符号右移>>>
,正数有符号右移高位补0,负数有符号右移补1,无符号右移高位全部补0,左移低位全部补0
一些例子:
- 5>>3=0
00000000 00000000 00000000 00000101
右移3位得到00000000 00000000 00000000 00000000
,转换成十进制就是0- -5>>3=-1
11111111 11111111 11111111 11111011
右移3位得到11111111 11111111 11111111 11111111
,由于是补码所以要先减1得到11111111 11111111 11111111 11111110
,再位反得到原码00000000 00000000 00000000 00000001
,值是1,因为是负数,所以结果是-1.- -5>>>3
右移3位得到:
00011111 11111111 11111111 11111111
最高位是0,结果变成正数,所以值是2^30+2^29+....2^1+2^0=536870911