进制之间的转换与位运算
二进制、八进制、十进制与十六进制,它们之间的区别在于数运算时逢几进一位。比如说二进制是逢2进一位,十进制也就是我们常用的0-9是逢10进一位。
①二进制
1.二进制转十进制:
方法:把二进制数按权展开、想加即得十进制数。
计算过程(二进制数 111000):
1) 先将二进制每一位展开
2) 从最后一位开始 进行相乘、想加。
从右向左: 0*(2的0次方)+0*(2的1次方)+0*(2的2次方)+1*(2的3次方)+ 1*(2的4次方)+1*(2的5次方)+1*(2的6次方) = 56
2.二进制转八进制:
方法:三位二进制数按权展开想加得到1位八进制数(从右向左,不足为补0)
计算过程(二进制数 11100111):
1) 先将二进制数每一位展开
2)从右向左 每三位合一位 :
111: 1*(2的0次方)+1*(2的1次方)+1*(2的2次方) = 7
100: 0*(2的0次方)+0*(2的1次方)+1*(2的2次方) = 4
011: 1*(2的0次方)+1*(2的1次方)+0*(0的2次方) = 3
转换结果为 347
3.二进制转十六进制
:
方法:四位二进制数按权展开想加得到1位八进制数(从右向左,不足为补0)
计算过程(二进制数 111001111):
1) 先将二进制数每一位展开
2)从右向左 每三位合一位 :
1111: 1*(2的0次方)+1*(2的1次方)+1*(2的2次方)+1*(2的3次方) = F
1100: 0*(2的0次方)+0*(2的1次方)+1*(2的2次方)+1*(2的3次方) = C
0001: 1*(2的0次方)+0*(2的1次方)+0*(0的2次方)+0*(2的3次方) = 1
转换结果为 1CF
②八进制
1.八进制转二进制:
方法:十进制除2取余法,即十进制除2,余数为权位上的数,得到的商值继续除2,知道运算商为0为止.
计算过程(八进制数 150):
1) 先将八进制数依次除2
150/2 = 75 余 0
75/2 = 37 余 1
37/2 = 18 余 1
18/2 = 9 余 0
9/2 = 4 余 1
4/2 = 2 余 0
2/2 = 1 余 0
1/2 = 0 余 1
2) 按照余数从后向前排位为 10010110
2.八进制转十进制:
方法:三位二进制数按权展开想加得到1位八进制数(从右向左,不足为补0)
计算过程(八进制数 225):
1) 先将八进制数按权展开
2)2*(8的2次方)+2*(8的1次方)+5*(8的0次方) = 149
3.八进制转十六进制:
方法1:先将八进制转换为二进制,然后4位二进制为1位十六进制,进行转换就可以了。此
处不再详解,参考上下文就可以。
③十进制
1.十进制转二进制:
方法:十进制除2取余法,即十进制除2,余数为权位上的数,得到的商值继续除2,知道运
算商为0为止.
计算过程(八进制数 140):
1) 先将八进制数依次除2
140/2 = 70 余 0
70/2 = 35 余 0
35/2 = 17 余 1
17/2 = 8 余 1
8/2 = 4 余 0
4/2 = 2 余 0
2/2 = 1 余 0
1/2 = 0 余 1
2) 按照余数从后向前排位为 10001100
2.十进制转八进制:
方法:方法跟二进制相同,除8直到商为0.
3.十进制转十六进制:
方法:方法跟二进制相同,除16直到商为0.
④十六进制
1.十六进制转二进制:
方法:现按权位分开,每位开始除2直到商为0为止.4位二进制为1位16进制一位,不足为补0
计算过程:(十六进制数14C)
1) 1/2 = 0 余 1
----> 0001
4/2 = 2 余 0 | 2/2 = 1 余 0 | 1/2 = 0 余 1 ----> 0100
C = 12 12/2 = 6 余 0 | 6/2 = 3 余 0 | 3/2 = 1 余 1 | 1/2 = 0 余 1
----> 1100
结果为 101001100
2.十六进制转八进制:
方法:建议先转为2进制,在转为十进制.
3.十六进制转十进制:
方法:用位加权乘,积想加法。
计算过程:(十六进制数18C)
1) 1*(16的2次方)+8*(16的1次方)+12*(16的0次方) = 396
结果为 396
二进制位与位运算(都是以补码操作)
计算机系统的内存储器,是由许多成为字节的单元组成的,1个字节由8个二进制构成,每位取值为0/1。最右端的
那1位成为“最低位”,编号为0;最左端的那1位成为“最高位”,而且从最低位到最高位顺序,依次编号。
原码:为“最低位”,编号为0;最左端的那1位成为“最高位”,而且从最低位到最高位顺序,依次编号。
原码:
数值的原码表示是指,将最高位用符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值(已二进制形
表示)的表示形式。
例如 +10 原码是 00001010
-10 原码是 10001010
反码:反码分为两种情况
1) 正数的反码与原码相同
2) 负数的反码:最高位为1 其余为全部取反
例如 -10 11110101
补码: 补码分为两种情况
1) 正数的反码与原码相同
2) 负数的补码:最高位为1 剩余7位 为原码取反+1
例如 -10 11110110
数据存储是以字节(Byte)为单位,数据传输是以大多是以"位"(bit,又名"比特")为单位,一个位代表一个1或0(即
二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
这是8中基本类型的内存中占用字节数(取值范围是2的(字节数X8-1)次方)
1.整型
类型 存储需求 bit数 取值范围
byte 1字节 1*8 (-2的31次方到2的31次方-1)
short 2字节 2*8 -32768~32767
int 4字节 4*8 (-2的63次方到2的63次方-1)
long 8字节 8*8 -128~127
2.浮点型
类型 存储需求 bit数 备注
float 4字节 4*8 float类型的数值有一个后缀F(例如:3.14F)
double 8字节 8*8 没有后缀F的浮点数值(如3.14)默认为double类型
3.char类型
类型 存储需求 bit数
char 2字节 2*8
4.boolean类型
类型 存储需求 bit数 取值范围
boolean 1字节 1*8 false、true
/**
*JAVA有符号左或右移运算
**/
左移位(<<)
正数
程序:
public void LeftMoving{
public static void main(String[] args){
system.out.println("4<<3 = "+(4<<3));
}
}
输出结果:
4<<3 = 32
计算过程
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0010 0000 32
负数
程序:
public void NegativeLeftMoving{
public static void main(String[] args){
system.out.println("-4<<2 = "+(-4<<2));
}
}
输出结果:
-4<<2 = -16
计算过程
补码:1111 1111 1111 1111 1111 1111 1111 1100 -4
移位:1111 1111 1111 1111 1111 1111 1111 0000 -16
原码:0000 0000 0000 0000 0000 0000 0001 0000 -16
右运算
正数
程序:
public void RightMoving{
public static void main(String[] args){
println.out.println("3>>2 = "(3>>2));
}
}
输出结果:
3>>1 = 1
计算过程
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0001 1
负数:
程序:
public void RightMoving{
public static void main(String[] args){
println.out.println("-3>>2 = "(-3>>2));
}
}
输出结果:
-3>>1 = 1
计算过程
1111 1111 1111 1111 1111 1111 1111 1101 -3
1111 1111 1111 1111 1111 1111 1111 1110 -2
总结: 在左位运算时,低位补0,在右位运算时,若为正数高位补0,低位补1。需要注意的是:在负数进行
操作时,应将负数先转换为补码,进行位移,然后转换为反码,+1,就变为位移后的原码。
/**
*无符号右移运算(>>>)
**/
其实与有符号移位运算的区别就是,在右移时,不管是正数还是负数,左边都补0.
例:
-5>>>3
反码:1011
右移后:1111
原码:0001
结果为-1
/**
*&与运算
**/
其实就是对位,如果n位都为1,n位等于1,如果n为一个为0,n为就等于0。
例:
6&3
6: 0110
3: 0011
&: 0010
结果为: 2
/**
* |或运算
**/
其实就是对位,如果n位有一个为1,n为就等于1。
6|3
6: 0110
3: 0011
|: 0111
结果为:7
/**
* ^异或运算
**/
其实就是n位相同,n位等于0,如果不相同,就等于1。
6^3
6: 0110
3: 0011
^: 0101
结果为:5
/**
* ~取反运算
**/
其实就是去反运算。
~6
6: 0110
~6: 1001 是一个负数
负数转换为原码 :
1001
-0001
1000
取反:0111
结果为:-7
总结:反码转换为原码 高位为1 其他位 -1 然后各位反转,或者先反转再+1
二进制转10进制 python 二进制转10进制算法步骤
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
第五节 二进制安装docker
二进制安装docker
docker linux 开机自启 -
python 二进制倒着 python二进制转10进制
使用内置函数实现进制转换实现比较简单,主要用到以下函数
python基础教程十进制 十进制 字符串 十六进制