34-进制与位运算
进制
进制介绍
对于整数,有四种表示方式
- 二进制:0,1,满2进1,以0b或0B开头
- 十进制:0-9,满十进一
- 八进制:0-7,满8进1,以数字0开头;
- 十六进制:0-9及A(10)-F(15),满16进1,以0x或0X开头。这里的A-F不区分大小写
进制图示
进制转换
2进制转换为10进制 (2->10)
- 规则:从最低位(右边)开始,将每位上的数提取出来,乘以2的(位数-1)次方,然后求和
- eg : 0b1011 = 1 * 2^0 + 1 * 2^1 + 1 * 2^2 = 11
8进制转换为10进制 (8->10)
- 规则:从最低位(右边)开始,将每位上的数提取出来,乘以8的(位数-1)次方,然后求和
- eg : 0234 = 4 * 8^0 + 3 * 8^1 + 2 * 8^2 = 156
16进制转换为10进制 (16->10)
- 规则:从最低位(右边)开始,将每位上的数提取出来,乘以16的(位数-1)次方,然后求和
- eg : 0x23A = 10 * 16^0 + 3 * 16^1 + 2 * 16^2 = 570
10进制转换为2进制 (10->2)
- 规则:将该数不断除以2,直到商为0为止,然而将没补得到的余数倒过来,就是对应的二进制
- 234 = 0b00100010
10进制转换为8进制 (10->8)
- 规则:将该数不断除以8,直到商为0为止,然而将没补得到的余数倒过来,就是对应的八进制
- 131 = 0203
10进制转换为16进制 (10->16)
- 规则:将该数不断除以16,直到商为0为止,然而将没补得到的余数倒过来,就是对应的十六进制
- 237 = 0ED
2进制转换为8进制 (2->8)
- 规则:从低位开始,将二进制数每三位一组,转成对应的十六进制数即可
- 0b11(3)010(2)101(5) = 0325
2进制转换为16进制 (2->16)
- 规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可
- 0b1101(D)0101(5) = 0xD5
8进制转换为2进制 (8->2)
- 规则:将八进制数每一位,转成对应的一个3位的二进制数即可
- 0237 = 0b010011111
16进制转换为2进制 (16->2)
- 规则:将十六进制数每一位,转成对应的一个4位的二进制数即可
- 0x23B = 0b1000111011
原码,反码,补码
- 二进制的最高位是符号位:0表示正数,1表示负数
- 正数的原码,补码,反码都一样(三码合一)
- 负数的反码 = 它的原码符号位不变,其它位取反(0->1,1->0)
- 负数的补码 = 它的反码 + 1
负数的反码 = 它的补码 - 1 - 0的反码补码都是0
- java没有无符号数,换言之,java中的数都是有符号的
- 在计算机运算的时候,都是以补码的方式来运算的
- 当我们看运算结果的时候,要看他的原码
位运算符
java中有7个位运算符(&,|,~,^, <<, >> , >>>)
&,|,~
-
按位与&:两位全为1,结果为1,否则为0
-
按位|:两位有一个为1,结果为1,否则为0
-
按位异或^ : 两位一个为1,一个为0,结果为1,否则为0
-
按位取反~:0->1 ,1->0
例:2&3,~-2,~2
>>,<<和>>>
- 算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
- 算数左移<<:符号位不变,低位补0
- >>>:逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0
- 特别说明:没有<<<符号
eg:
int a =1>>2 ; //1 => 00000001 => 00000000 本质:1/2/2 = 0
int a =1<<2 ; //1 => 00000001 => 00000100 本质:122 = 0