进制学习笔记

进制

一组符号,逢几进几

二进制

二进一,由 0、1 组成

十进制0123456789
二进制01101110010111011110001001

八进制

八进一,8 个符号组成: 0 1 2 3 4 5 6 7

十进制01234567891011121314151617
八进制0123456710111213141516172021

十进制转八进制:

将十进制数 37 除以 8 得到商 4,4×2=8,再加上 37 本身,得到 45。

这个过程可以表示为数学表达式:
八进制数 = (十进制数 ÷ 8) × 2 + 十进制数
八进制转十进制:在这里插入图片描述

十六进制

十六进一,16 个符号组成:0 1 2 3 4 5 6 7 8 9 a b c d e f

十进制0123456789101112131415161718
十六进制0123456789abcdef101112

十进制转十六进制:

将十进制数 37 除以 16 得到商 2,余数 5;2×10=20,再加上余数 5,得到 25。
十六进制数 = (十进制数 ÷ 16) × 10 + 十进制数 % 16
十六进制转十进制:
在这里插入图片描述

自定义进制

自选八个符号:0 10 8 7 4 20 x y

十进制01234567891011121314151617
自定义01087420xy1001010108107104102010x10y80810

进制的运算

  • 八进制运算

例:将123、45两数进行四则运算
  • 加法

    123 + 45

    将两个数字的最后一位进行逐个计算,

    3+5 根据上表十进制 8 对应的结果为 10,得出结果尾数写 0 进 1;res = 0;

    2+4+进 1 得出中间位数为 7;res = 70;

    故八进制123+45=170。

  • 减法

    123 - 45

    减法既是加法
    123 + (-45) = 56

  • 乘法

    123 * 45

    计算乘法时可以借助十进制乘法表 10 进制 8 的次数乘以 2

    尾数 3 * 5,十进制第 15 个数对应八进制 17,末位写 7 进 1,

    以此类推得出 123 * 5 的结果与 123 * 40的结果相加为:637+ 5140 = 5777。

    由此可见进制的乘法同样也是加法。

  • 除法

    123 / 45

    除法:被除数 = 除数 * 商;

    就是说多少个除数等于被除数,本质还是加法。


无符号数和有符号数

  • 无符号数规则
    十六进制最符合二进制切换

    二进制数:1 1 0 0  0 0 1 1
    十六进制:1 1 0 0 为 c,0 0 1 1 为 3, 没有规则的情况下这个数对应 16 进制 0xc3
    
  • 有符号位规则
    最高位是符号位:1(负数)、0(正数)

    二进制数:1 1 0 0  0 0 1 1
    十六进制:根据原码反码补码转换,在有符号位的情况下,这个二进制数表示十进制的-64
    

原码反码补码

编码规则

  • 有符号位规则
    • 源码:最高位符号位,对其它的位进行本身绝对值表示
    • 反码:
      • 正数:反码和原码相同;
      • 负数:符号数一定是 1,其余位对原码取反。
    • 补码:
      • 正数:补码和原码相同;
      • 负数:符号位一定是 1,对反码加 1。

负数在计算机中以补码的方式存储

用 8 位举例
正数 8

原码:0 0 0 0  1 0 0 0
反码:0 0 0 0  1 0 0 0 反码和原码相同;
补码:0 0 0 0  1 0 0 0 补码和原码相同;

负数 8

原码:1 0 0 0  1 0 0 0
反码:1 1 1 1  0 1 1 1 符号数一定是 1,其余位对原码取反。
补码:1 1 1 1  1 0 0 0 符号位一定是 1,对反码加 1。

十六进制 ff

ff = 1 1 1 1  1 1 1 1
原码:1 1 1 1  1 1 1 1
反码:1 0 0 0  0 0 0 0
补码:1 0 0 0  0 0 0 1 结果为-1

1 1 0 0 0 0 1 1

原码:1 1 0 0  0 0 1 1
反码:1 0 1 1  1 1 0 0
补码:1 0 1 1  1 1 0 1 结果为-61

位运算

  • 与运算(& and)

两数都为 1,结果为 1
0 0 1 0 1 1 0 0
0 1 0 0 1 0 1 0 ( & )
--------------------------------
0 0 0 0 1 0 0 0 运算结果

  • 或运算(| or)

两数只要有一个为 1,结果为 1
0 0 1 0 1 1 0 0
0 1 0 0 1 0 1 0 ( | )
--------------------------------
0 1 1 0 1 1 1 0 运算结果

  • 异或运算(xor ^)

两数不一样为 1
0 0 1 0 1 1 0 0
0 1 0 0 1 0 1 0 ( ^ )
--------------------------------
0 1 1 0 0 1 1 0 运算结果

  • 非运算(单目运算符 not ~)

对当前数进行取反,0 就是 1,1 就是 0
0 0 1 0 1 1 0 0 ( ~ )
--------------------------------
1 1 0 1 0 0 1 1 运算结果

  • 位运算(移动位)

    • 左移:(<< 左移)

    所有二进制位全部左移,高位丢弃,低位补0
    0 0 1 0 1 1 0 0 ( << )
    --------------------------------
    0 1 0 1 1 0 0 0 运算结果

    • 右移:(右移 >>)

    所有二进制位全部右移,底位丢弃,高位根据符号位决定补 1 ,0
    0 0 1 0 1 1 0 0 ( >> )
    --------------------------------
    0 0 0 1 0 1 1 0 运算结果


二进制位运算(加减乘除)

不同于生活中十进制运算,计算机只认识 1,0
那么计算机是怎样进行运算的?

  • 加法
    举例 5 + 9
    0 0 0 0 0 1 0 1 二进制 5
    0 0 0 0 1 0 0 1 二进制 9
    ———————————
    0 0 0 0 1 1 1 0 结果为 14

    1. 异或运算:如果不考虑进位,异或可以直接出结果
       0 0 0 0  0 1 0 1 
       0 0 0 0  1 0 0 1
    -----------------------( ^ )	
       0 0 0 0  1 1 0 0
    
    2. 与运算:判断进位,如果结果为 0,说明没有进位
       0 0 0 0  0 1 0 1 
       0 0 0 0  1 0 0 1
    -----------------------( & )
       0 0 0 0  0 0 0 1
    
    3. 将与运算的结果进行左移一位(因为与运算的结果不为 0,表示进位了)
       0 0 0 0  0 0 0 1
    -----------------------( << )
       0 0 0 0  0 0 1 0 左移一位
    
    4.  异或运算:将第一步的结果和第三步的结果异或
       0 0 0 0  1 1 0 0
       0 0 0 0  0 0 1 0
    -----------------------( ^ )	
       0 0 0 0  1 1 1 0 
    
    5. 与运算:将第一步的结果和第三步的结果与运算,判断是否进位(重复步骤 2)
       0 0 0 0  1 1 0 0
       0 0 0 0  0 0 1 0
    -----------------------( & )
       0 0 0 0  0 0 0 0 结果为 0,表示没有进位,运算结束,如果有进位继续重复以上步骤
    
    得到结果为:
       0 0 0 0  1 1 1 0
    
  • 减法
    举例 5 - 9
    计算机在执行减法时实际上会将减法操作转换为加法操作
    5 - 9 = 5 + (-9)
    0 0 0 0 0 1 0 1 二进制数 5,符号位正数的补码等于本身
    1 0 0 0 1 0 0 1 二进制数 -9,补码为 1 1 1 1 0 1 1 1

    1. 异或
    0 0 0 0  0 1 0 1
    1 1 1 1  0 1 1 1
    -----------------------( ^ )	
    1 1 1 1  0 0 1 0
    
    2. 与
    0 0 0 0  0 1 0 1
    1 1 1 1  0 1 1 1
    -----------------------( & )	
    0 0 0 0  0 1 0 1
    
    3. 与不为 0,进位左移
    0 0 0 0  0 1 0 1
    -----------------------( << )
    0 0 0 0  1 0 1 0	
    
    4. 将进位结果与上次异或结果进行异或
    1 1 1 1  0 0 1 0
    0 0 0 0  1 0 1 0
    -----------------------( ^ )	
    1 1 1 1  1 0 0 0
    
    5. 步骤 4 进行与运算判断是否进位
    1 1 1 1  0 0 1 0
    0 0 0 0  1 0 1 0
    -----------------------( & )	
    0 0 0 0  0 0 1 0
    
    6. 重复步骤 3,与不为 0,进位左移
    0 0 0 0  0 0 1 0
    -----------------------( << )
    0 0 0 0  0 1 0 0	
    
    7. 重复步骤 4,将进位结果与上次异或结果进行异或
    1 1 1 1  1 0 0 0
    0 0 0 0  0 1 0 0	
    -----------------------( ^ )	
    1 1 1 1  1 1 0 0
    
    8. 重复步骤 5,与运算判断是否进位
    1 1 1 1  1 0 0 0
    0 0 0 0  0 1 0 0	
    -----------------------( & )	
    0 0 0 0  0 0 0 0
    
    9. 与运算结果为 0,得出结果为补码 1 1 1 1  1 1 0 0
    1 1 1 1  1 1 0 0 补码
    1 0 0 0  0 0 1 1 反码
    1 0 0 0  0 1 0 0 加 1 得到结果原码为 -4
    
  • 乘法
    x * y,y 个 x 相加。

  • 除法
    x / y, x 中有多少个y。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值