⼆进制、⼗进制、⼗六进制理解
1.如何理解⼆进制、⼗进制、⼗六进制
1.1 ⼗进制的理解:
⽣活中我们遇到的绝⼤部分数据都是⼗进制的,⽐如7、24、30、365等,如果把它们按照个位、⼗位、百位分解,可以这样表⽰:数值个位⼗位百位
7700
24420
30030
365563
把表格中的数值,⽤数学运算表达式表⽰是这样的:
数值分解
71*7
2410*2+1*4
3010*3+1*0
365100*3+10*6+1*5
⼗进制是“逢⼗进⼀”的规则,例如数字9,已经是个位上能够表⽰的最⼤的数值了,如果要表⽰更⼤的数值,就需要突破个位,使⽤⼗位来组成⼀个“数字串”来表⽰了,⽐如10(⼗位上是1,个位上是0),因此对⼗进制的的加法可以这样理解:
例如:8+7=15
1. =8+(2+5)
2. =8+2+5
3. =10+5
4. =15
1.2⼆进制的理解
⼆进制是“逢⼆进⼀”,也就是说⼆进制只有0、1两个数字来表⽰,遇到2时就需要向⾼位“进⼀”了,⽐如“24”使⽤⼆进制来表⽰就是“0001 1000”
如果在书写或者程序中使⽤这样的表⽰⽅式,就太啰嗦了,且不便于 其他进制区分,所以有了⼀个来表⽰⼆进制的规定,就是0b(⼗六进制是0x来表⽰),⽐如刚才的“0000 0000 0001 1000”可以使⽤“0b00011000”。
在⼗进制中像365这样的数值,我们可以这样理解:
1. 365=100*3+10*6+1*5
相应的在⼆进制中也有类似的规则,区别是:
⼗进制是“逢⼗进⼀”,采⽤“个/⼗/百/千/......”的进位递增;
⼆进制是“逢⼆进⼀”,采⽤“1/2/4/8/16/......”的进位递增;
下⾯以⼏个⼆进制数值来举例:
把上⾯表格的表达⽅式⽤数学运算表达式表⽰的话,是这样的:
其实根本就在于,⼗进制中相邻进制之间相差10倍,⽽⼆进制中相邻进制之间相差的是2倍,只要记住这点,然后使⽤⼗进制相似的规则去套就⾏了。
1.3⼗六进制的理解
在理解⼆进制的基础上来理解⼗六进制,只需要转换⼀些概念就⾏。
⼗六进制是使⽤16个“数字”来表⽰的,由于0~9只有10个数字,因此就制定了A、B、C、D、E、F六个字母来表⽰剩余的⼏个数字,分别是10、11、12、13、14、15。
简单来说,就是把四个⼆进制“数字”为⼀组,合起来⽤⼀个“⼗六进制”⾥的“数字”来表达。
⼆进制的表达使⽤的是0b,⼗六进制的表达使⽤的是0x
我们按照前边的⼗进制和⼆进制的⽅式来举例⼏个⼗六进制的数值:
上⾯表格的表达⽅式⽤数学运算表达式表⽰的话,就是下⾯这样:
请留意:0xA等于10,0xF等于15
在⼆进制和⼗进制中,相邻进制之间相差的倍数分别为2倍和10倍,⽽在⼗六进制中从上表可以看出相邻进制之间相差倍数为16倍,也就是:
“逢⼗六进⼀”,采⽤“1/16/256/4096/......”的进位递增。
1.4补充信息
针对上⾯的描述,补充⼀些信息:
1. 书写⼆进制数值时,为了⼯整⼀般会补⾜四位
例如:“0b110”⼀般写作“0b0110”
1. 书写⼗六进制数值时,为了⼯整⼀般会补⾜两位或者四位
例如:0x06(补⾜为两位),0x01FF(补⾜为四位)
2.Java中实现⼆进制、⼗进制、⼗六进制转换
Java中的Integer类提供了将int转为⼆进制、⼋进制、⼗进制、⼗六进制的⽅法,分别是:
Form To Method
⼗进制⼗六进制HexString(int i)
⼗进制⼋进制OctalString(int i)
⼗进制⼆进制BinaryString(int i)
⼗六进制⼗进制Integer.valueOf("FFFF",16).toString()
⼋进制⼗进制Integer.valueOf("876",8).toString()
⼆进制⼗进制Integer.valueOf("0101",2).toString()
通过Integer.parseInt()⽅法可直接将⼆进制、⼋进制、⼗六进制转为⼗进制
parseInt(String s, int radix)
使⽤第⼆个参数指定的基数,将字符串参数解析为有符号的整数。
3.Java &、&&、|、||、^、<<、>>、~、>>>等运算符
java运算⼤致分为逻辑运算符、算数运算符、位运算符和其他运算符:
逻辑运算符:&&、||、!
算数运算符:+、-、*、/、+=
位运算符:^、|、&
其他运算符:三元运算符
3.1.1逻辑与(&&)
&&逻辑与也称为短路逻辑与,先运算&&左边的表达式,⼀旦为假,后续不管多少表达式,均不再计算,⼀个为真,再计算右边的表达式,两个为真才为真
举例:
if(a == 0 && b==1)
3.1.2逻辑或(||)
逻辑或||的运算规则是⼀个为真即为真,后续不再计算,⼀个为假再计算右边的表达式。
举例:
if(a==0 || b==0)
3.1.3逻辑⾮(!)
即表⽰不等于
举例:
if(a != 0)
3.1.4按位与(&)
&按位与的运算规则是将两边的数转换为⼆进制位,然后运算最终值,运算规则即(两个为真才为真)1&1=1 , 1&0=0 , 0&1=0 , 0&0=0
举例:
int i = 3 & 5;
3的⼆进制位是0000 0011 , 5的⼆进制位是0000 0101 , 那么就是011 & 101,由按位与运算规则得知,001 & 101等于0000 0001,最终值为1
3.1.5按位或(|)
|按位或和&按位与计算⽅式都是转换⼆进制再计算,不同的是运算规则(⼀个为真即为真)1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1
举例:
int i = 6 | 2;
6的⼆进制位0000 0110 , 2的⼆进制位0000 0010 , 110|010为110,最终值0000 0110,故6|2等于6
3.1.6异或运算符(^)
^异或运算符顾名思义,异就是不同,其运算规则为1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0
举例:
int i = 5 ^ 9;
5的⼆进制位是0000 0101 , 9的⼆进制位是0000 1001,也就是0101 ^ 1001,结果为1100 , 00001100的⼗进制位是12
3.1.7左移运算符(<<)
凡位运算符都是把值先转换成⼆进制再进⾏后续的处理.
举例:
int i = 5 << 2;
5<<2的意思为5的⼆进制位往左挪两位,右边补0,5的⼆进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第⼀位补0,负数补1,等于乘于2的n次⽅,⼗进制位是20
3.1.8右移运算符(>>)
凡位运算符都是把值先转换成⼆进制再进⾏后续的处理.
举例:
int i = 5 >> 2;
5的⼆进制位是0000 0101,右移两位就是把101左移后为0000 0001,正数左边第⼀位补0,负数补1,等于除于2的n次⽅,结果为1
3.1.9取反运算符(~)
取反就是1为0,0为1
规律:正整数N取反结果为:负(N+1);负整数-N取反结果为:N-1
举例:
int i = ~5;
5的⼆进制位是0000 0101,取反后为1111 1010,值为-6
3.1.10⽆符号右移运算符(>>>)
正数⽆符号右移
⽆符号右移运算符和右移运算符的主要区别在于负数的计算,因为⽆符号右移是⾼位补0,移多少位补多少个0。
举例:
int i = 15 >>> 2;
ascii是几位二进制编码
15的⼆进制位是0000 1111 , 右移2位0000 0011,结果为3
负数⽆符号右移
举例:
long i = -6 >>> 3;
-6的⼆进制是6的⼆进制取反再加1,6的⼆进制也就是0000 0000 0000 0000 0000 0000 0000 0110,取反后加1为1111 1111 1111 1111 1111 1111 1111 1010,右移三位0001 1111 1111 1111 1111 1111 1111 1111
4.int & 0xFF的含义
在将byte字节转为Hex⼗六进制时,会使⽤ & 0xFF将字节值处理⼀下,如下图所⽰:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论