如有笔误,欢迎留言指正或讨论!

进制介绍

  • 计算机内部运行各种运算时,都是以二进制的方式来运行;

二进制:0 1 满2进1

八进制:0-7 满8进1, 以数字 0 开头

十进制:0-9 满9进1

十六进制:0-9 + A-F 满16进1,0x、0X开头,A-F不区分大小写


二进制重要的三个概念

原码、反码、补码

!!!在计算机运算的时候,都是以 补码 的方式来运算的。 !!!

对于有符号的而言:

  • 二进制的最高位是符号位:0表示正数,1表示负数

    首位表示符号位
    
    比如按照byte (字节: 8位):1 ===》[0000 0001]	 -1 ===》[1000 0001]
  • 正数的原码、反码、补码都一样(三码一致)

  • 负数的反码 = 它的原码符号位 不变,其它取反( 0->1, 1->0)

     1 ===》原码[0000 0001] 反码[0000 0001] 补码[0000 0001]
    
    -1 ===》原码[1000 0001] 反码[1111 1110] 补码[1111 1111]
  • 负数的补码 = 它的反码+1

  • 0 的反码、补码都是 0

  • !!!在计算机运算的时候,都是以 补码 的方式来运算的。 !!!


位运算符

  • & (按位与) 当二进位同时为 1 时,结果为 1,否则为 0

    2&3
    2的补码	0000 0010
    3的补码	0000 0011
    
    结果 =  0000 0010  转成十进制  =  2
  • | (按位或) 当二进位有一个为 1时,结果为 1,否则为 0

    2|3
    2的补码	0000 0010
    3的补码	0000 0011
    
    结果 =  0000 0011  转成十进制  =  3
  • ^ (按位异或) 当二进位 不同 时,结果为 1,否则为 0

    2^3
    2的补码	0000 0010
    3的补码	0000 0011
    结果 =  0000 0001  转成十进制  =  1
    
    ----------------------------------------------------------
    
    -2^2
    题目分析:
    	1、计算机的运算都是按照 补码 来运算的;
    	2、先求出-2的 原码、反码、补码:
    		先求 原码,再求反码(原码符号不变,其它位取反),再求补码(反码+1)
    	3、3是正数 原码、反码、补码 都是一样的;
    	4、-2 和 3 的 补码 比较完后需要转成反码,再转原码,再在进行二进制转十进制,得出结果;
    
    -2的 原码:1000 0010   反码:1111 1101		补码:1111 1110
    -2的补码:1111 1110
    3的补码:	0000 0010
    
    结果补码 =  1111 1100
    结果补码 转 反码(补码+1):1111 1011
    反码 转 原码(符号不变,其他取反):1000 00100
    原码 转 十进制 :-4
  • 《 (左移运算) 左边的运算数的 各二进位 全部左移n位;(左移n位就是 乘以 2的n次方)

    • 符号位不变,低位补 0
    //正数的三码一样
    a := 1 >> 2
    // 1的补码 0000 0001 右移 2 位
    //
  • 》(右移运算) 右边的运算数的 各二进位 全部右移n位;(右移n位就是 除以 2的n次方)

  • 低位溢出,符号不变,并用符号位补溢出的高位

//正数的三码一样,溢出了
a := 1 >> 2
// 1 的补码 0000 0001 右移 2 位
//结果:0000 0000 ===》 0


//正数的三码一样
b := 1 << 2
// 1 的补码 0000 0001 左移 2 位
// 结果:0000 0100 ===》 4

其它进制 转 十进制

二进制 转 十进制

从最低位开始(最右边),每个位上的数提取出来,乘以2的(位数-1)次方,然后求和

如:二进制:1011 (从右到左)

第一位:1  * ( 2(1-1)次方= 1 )  = 1

第二位:1  * ( 2(2-1)次方= 2 )  = 2

第三位:0  * ( 2(3-1)次方= 4 )  = 0

第四位:1  * ( 2(4-1)次方= 8 )  = 8

求十进制 = (1 + 2 + 0 + 8) =  11

八进制 转 十进制

从最低位开始(最右边),每个位上的数提取出来,乘以8的(位数-1)次方,然后求和

注意:八进制是按 0 开头,0不参与计算!


十六进制 转 十进制

从最低位开始(最右边),每个位上的数提取出来,乘以16的(位数-1)次方,然后求和

注意:十六进制是按 0x 开头,0x不参与计算!

如:0x33A  位数:3 3 10

0x不参与计算,其它位数参与计算,16位数(0-9,A = 10 ~ F=15 ) 按照上边的计算即可;

十进制 转 其它进制

十进制 转 二进制

将该数不断除以2,知道商为0为止,然后将每步得到的 余数倒过来 ,就是二进制;

如:十进制:56

56 / 2 = 28		0

28 / 2 = 14		0

14 / 2 = 7		0

7 / 2 = 3			1

3 / 2 = 1			1

剩余 1		     1

求二进制  =  111000

十进制 转 八进制

将该数不断除以8,知道商为0为止,然后将每步得到的 余数倒过来 ,就是二进制;

注意:八进制是按 0 开头,除8的余数小于8后,在每步得到的余数倒过来前加 0;

如:156	结果 :4 3 2(余数倒叙取值为:2 3 4)

求八进制 结果前 加 0 :0234

十进制 转 十六进制

将该数不断除以16,知道商为0为止,然后将每步得到的 余数倒过来 ,就是二进制;

注意:十六进制是按 0x 开头,除16的余数小于16后,在每步得到的余数倒过来前加 0x;

如:356	结果 :4 6 1(余数倒叙取值为:1 6 4)

求十六进制 结果前 加 0x :0x164

二进制 转 八&十六进制

二进制 转 八进制

将 二进制数 每三位一组(从低位开始组合),每组转成对应的 八进制数 即可;

注意:八进制是按 0 开头,在结果前加 0;

如:二进制 11010101

101 二进制 转 八进制 = 5

010 二进制 转 八进制 = 2

11 二进制 转 八进制 = 3

求八进制 结果前加 0 = 0325

二进制 转 十六进制

将 二进制数 每四位一组(从低位开始组合),每组转成对应的 十六进制数 即可;

注意:十六进制是按 0x 开头,在结果前加 0x;

如:二进制 11010101
 
0101 二进制 转 十六进制 = 5
  
1101 二进制 转 十六进制 = 13(13 在十六进制用 D 标识(16位数(0-9,A = 10 ~ F=15 ))D

求十六进制 结果前加 0x = 0xD5

八&十六进制 转 二进制

八进制 转 二进制

将八进制数每1位,转成对应的 一个3位的二进制数 即可;

注意:八进制是按 0 开头,0不参与计算!

如:八进制:0237

7 转成一个三位的二进制数 = 111

3 转成一个三位的二进制数 = 011

2 转成一个三位的二进制数 = 10

求二进制的结果 = 10 011 111

十六进制 转 二进制

将十六进制数每1位,转成对应的 一个4位的二进制数 即可;

十六进制是按 0x 开头,0x不参与计算!

如:八进制:0237

7 转成一个四位的二进制数 = 0111

3 转成一个四位的二进制数 = 0011

2 转成一个四位的二进制数 = 0010 (最后00没有值,直接舍去)= 10

求二进制的结果 = 10 0011 0111