进制转换
2B(0--1),8O(0--7),10D,16H(0——9,A——F)
8位二进制数,左边高位,右边低位
2,8,16 -> 10进制整数,小数
- 整数:从后往前,依次(每位)* 进制(2,8,16) ^ (0++),最后求和
- 小数:从前往后,依次(从小数点后每位)* 进制(2,8,16) ^ (-1- -),最后求和
- 最后整体求和
10 ->2,8,16进制整数,小数
- 整数:不断除进制(2,8,16),直到商为0,反向读取余数
- 小数:不断乘进制(2,8,16),向下取整,正向读取,写在小数点后,每次执行都获得一个精度
- 和整数部分同时输出
2 -> 8,16进制
- 2 -> 8从后往前,每3位合为一个二进制位
- 2 -> 16从后往前,每4位合为一个二进制位
8,16 -> 2进制
- 8 -> 2每一个八进制位转换为3个二进制
- 16 -> 2每一个十六进制位转换为4个二进制
8 ->16进制
- 通过2/10进制间接转换
原码,反码,补码
原码:对于signed的整数,最高位是符号位:正(0)负(1),其余为是数值的绝对值,对于加减运算操作不友好,需要通过反码或补码来完成
反码:正数和原码一致,负数为十进制形式的绝对值按位取反,符号位不变,表示-128(对于8位时)
补码:正数和原码一致,负数为反码 + 1
有效范围
unsigned无符号8位,0——255
signed有符号8位,- 128——127
每增一位,都是前一位的2倍
二进制运算
计算机运算都是以二进制补码形式
加法:
5 + 1 都是正数,正数原反补都一致,对应位相加,
0 + 0 = 0, 0 + 1 / 1 + 0 = 1, 1 + 1 = 2->转为2进制 = 10(进一位), 1 + 1 + 1 = 3->转为2进制 = 11(进一位)
减法:
5 - 1 = 5 + (-1),5的补码和原码一致0101,-1的补码计算得到1111,
因此相加=10100,忽略最高位,为4
位运算
我们直到计算机都是以二进制形式存储,因为对位的操作,比普通运算符要快许多,因此尽量使用位运算代替普通运算符
位运算符
常见位操作
常见的位十进制操作
乘除法
a << 1 ≡ a ∗ 2
a >> 1 ≡ a / 2
交换整形变量值
void swap(int &a,int &b){a ^= b;b ^= a;a ^= b;}
判断奇数偶数
a & 1
对负数取绝对值
~ a + 1