进制也就是进位制,是人们规定的一种进位方法。对于任何一种进制,x进制表示某一位置上的数运算时是逢x进一位。十进制是逢十进一、十六进制是逢十六进一、二进制是逢二进一。
各进制数表示
八进制是逢8进1,所以到8的时候向前进一位,变成10;十六进制10-15用A-F表示,逢16向前进一位,即为10(所有进制都是从最小0开始)
64进制,所用的字符是0-9,a-z,A-Z,+,/
“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/”
二进制
二进制数据是用0和1两个数码来表示的数,规则是逢二进一
bit(比特):一个二进制代表一位,一个位只能表示0或1两种状态。数据传输习惯以“位”(bit)为单位
Byte(字节):一个字节为8个二进制位,计算机中最小的存储单位是字节。数据存储习惯以“字节”(Byte)为单位
1k=1024个字节(B)
八进制
一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢8进1。以数字0开始表明该数字是八进制。
八进制的数和二进制的数可以按位对应(八进制一位对应二进制三位)
十六进制
由0-9,A-F组成,字母不区分大小写
十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位)
1. 十进制转二进制方法
- 十进制的整数转换成二进制
用十进制数除以2,分别取余数和商,商为0的时候,将余数倒着数就是转化后的结果
- 十进制的小数转换成二进制
小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转换后的结果
1)乘的时候只乘小数部分
2)0.432只有3位,所以只需要3位,0 0 1 就停止计算
3)0.432的二进制数为:0.011
2. 八进制与二进制转换
1)二进制转八进制
三位一组,将二进制数对应到十进制整数上(不超过8)
101 001 111 011
5 1 7 3
2)八进制转二进制
1 2 5
001 010 101
3. 十进制与八进制转换
1)十进制转八进制
用十进制数除以8,分别取余数和商,商为0的时候,将余数倒着数即为转化后的结果
4. 十六进制与二进制转换
0101 0111 1010 1011 0101
5 7 A B 5
5. 十进制转化十六进制
用十进制数除以16,分别取余数和商,商为0的时候,将余数倒着数就是转化后的结果
6. 其他转换
十进制 以正常数字1-9开头,如123
八进制 以数字0开头,如0123(在八进制数前加上0)
十六进制 以0x开头,如0x123(在十六进制数前加上0x)
二进制 c语言不能直接书写二进制数
相关题目:leetcode 405题
二进制位运算左移:将一个运算对象的二进制位全部左移若干位,左边的二进制丢弃,右边补0
右移同理。
int val = 3;
int ans = (val >> 4) & 0xf;
// 0xf 是16进制写法 ,等于十进制的15,等于二进制的1111,& 0xf表示取变量的后四位
1. 原码
原码(原始的二进制码),特点:
(1)最高位作为符号位,为0表示正数,1表示负数
(2)其他数值部分就是数值本身绝对值的二进制数
(3)负数的原码是在其绝对值的基础上,最高位变为1
以1字节(8位)的大小描述:
十进制数 | 原码 |
+15 | 0000 1111 |
-15 | 1000 1111 |
+0 -0 | 0000 0000 1000 0000 |
原码不方便加减运算
2. 反码
(1)对于正数,反码和原码相同
(2)对于负数,符号位不变,其他部分取反(1-->0, 0-->1)
(3)反码运算也不方便,通常用来作为求补码的中间过渡
3. 补码
在计算机系统中,数值一律使用补码来存储
(1)对于正数,原码、反码、补码相同
(2)对于负数,补码为反码+1
(3)补码符号位不动,其他位取反,最后整个数+1,得到原码
#include <iostream>
int main() {
int val = -15;
// printf("%x\n", val); // c语言写法
std::cout << std::hex << val << std::endl; // 十六进制
return 0;
}
// 输出结果为fffffff1 (补码)
// fffffff1 对应的二进制:1111 1111 1111 1111 1111 1111 1111 0001
// 符号位不变,其他取反: 1000 0000 0000 0000 0000 0000 0000 1110
// 上面+1得到原码: 1000 0000 0000 0000 0000 0000 0000 1111(最高位1表示负数,-15)
计算机中使用补码存储的原因:
- 将符号位和其他位统一处理
- 将减法运算转变为加法运算
- 两个补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃