第一部分--进制
理论上讲,进制的数量是无限的。
> 但初赛中常考的是下表内容
进制 表示 开头 举例 二进制 B 0b int a = 0b10 八进制 O 0 int a = 071 十进制 D --- int a = 44 十六进制 H 0x int a = 0x7F
注意:十六进制中超过10(包含10)的数使用A~F表示
> N进制转十进制
位权法--每一位上的数值乘对应的权值
例如:
(100.011)b(100.011)_b(100.011)b 转化成十进制
整数部分
(100)b=0×20+0×21+1×22=4(100)_b = 0 \times 2^0 + 0 \times 2^1 + 1 \times 2^2 = 4(100)b =0×20+0×21+1×22=4
小数部分
(0.011)b=0×2−1+1×2−2+1×2−3=0.375(0.011)_b = 0 \times 2^{-1} + 1 \times 2^{-2} + 1\times 2^{-3} = 0.375(0.011)b =0×2−1+1×2−2+1×2−3=0.375
转换结果
4+0.375=4.3754 + 0.375 = 4.3754+0.375=4.375
所以
(100.011)b=(4.375)d(100.011)_b=(4.375)_d(100.011)b =(4.375)d
由此我们知道:
数值就是当前这一位的数
权值就是n的不同次方(n是n进制中的n)
> > 代码实现(模板)
> 十进制转N进制
* 整数部分
短除法--除2取余,逆序排列(遇到商为0结束)
例:(42)d⟶(101010)b(42)_d\longrightarrow (101010)_b(42)d ⟶(101010)b
* 小数部分
短除法--乘2取整,逆序排列
例:(0.625)d⟶(0.101)b(0.625)_d\longrightarrow (0.101)_b(0.625)d ⟶(0.101)b
* 我们发现整数和小数的十进制数的方法刚好是反过来的
> > 代码模版:
第二部分--原反补码
数值在计算机中,均以补码的方式存储。
> 6个概念
>
> > 机器数:一个数在计算机中的二进制表示。它是带符号的,最高位为 0 表示正数,1 表示负数
>
> > 机器码:原码反码补码
>
> > 真值:机器数对应的真正数值
>
> > 原反补码
> >
> > > 原码:符号位+数值位
> >
> > > 反码:正数反码=原码;负数反码=原码除符号位以外其余位取反
> >
> > > 补码:正数补码=反码=原码;负数补码=反码+1,(需要进位)
我们要先知道:求出数字的补码是为了进行加减法
所以这里以-10+5来举例
前面说过,数值在计算机中都以补码的方式存储
所以我们要先把-10和5写成补码:
-10
* 原码(这里写成八位二进制):1 000 1010
* 反码(这里写成八位二进制):1 111 0101
* 补码(这里写成八位二进制):1 111 0110 ⟶\longrightarrow⟶其实我们不用担心进位会进到符号位那里,因为不存在这种情况
5
* 原码(这里写成八位二进制):0 000 0101
* 反码(这里写成八位二进制):0 000 0101
* 补码(这里写成八位二进制):0 000 0101
1111 0110
0000 0101
————————
1111 1011
1111 1011是结果的补码!
1111 1011转原码:
* 反码:1111 1010
* 原码:1000 0101
* 真值: -5
而-10+5就是等于-5
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
有建议,直接提
希望上精华,希望被点赞,还希望上热门讨论
有些根据集训营笔记写的