进制
一组符号,逢几进几
二进制
二进一,由 0、1 组成
十进制 0 1 2 3 4 5 6 7 8 9 二进制 0 1 10 11 100 101 110 111 1000 1001
八进制
八进一,8 个符号组成: 0 1 2 3 4 5 6 7
十进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 八进制 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 十进制转八进制:
将十进制数 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
十进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 十六进制 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 十进制转十六进制:
将十进制数 37 除以 16 得到商 2,余数 5;2×10=20,再加上余数 5,得到 25。
十六进制数 = (十进制数 ÷ 16) × 10 + 十进制数 % 16
十六进制转十进制:
自定义进制
自选八个符号:0 10 8 7 4 20 x y
十进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 自定义 0 10 8 7 4 20 x y 100 1010 108 107 104 1020 10x 10y 80 810
进制的运算
例:将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 结果为 141. 异或运算:如果不考虑进位,异或可以直接出结果 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 11. 异或 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。