您的位置:首页 > 其它

二进制转换及位运算

2016-02-25 08:53 176 查看
进制之间的转换与位运算

二进制、八进制、十进制与十六进制,它们之间的区别在于数运算时逢几进一位。比如说二进制是逢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.十进制转十六进制:
方法:方法跟
b8be
二进制相同,除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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: