1.基本概念
c语言有十进制,二进制,八进制,十六进制
先大致了解一下这几个进制。
十进制:就是0 1 2 3 4 5 6 7 8 9
,满十进一
二进制:只有0 1
,满二进一
八进制:0 1 2 3 4 5 6 7
,满八进一
十六进制0 1 2 3 4 5 6 7 8 9 a b c d e f
,和二进制转换
下面看一下这几个进制的互相转换
十进制 二进制 八进制 十六进制
0 0000 0 0
1 1000 1 1
2 1000 2 2
3 1100 3 3
4 1000 4 4
5 1010 5 5
6 1100 6 6
7 1110 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 a
11 1011 13 b
12 1100 14 c
13 1101 15 d
14 1110 16 e
15 1111 17 f
2.进制转化的计算
- 二进制转十进制
因为十进制是逢十进一,所以正常计算就行
举一个例子说明
比如二进制1 1 0 1
比如二进制`1 1 0 1`
对应权重 2^3 2^2 2^1 2^0
计算十进制1x2^3+1x2^2+0x2^1+1x2^0=13
- 二进制转化八进制
二进制满二进一,八进制满八进一
所以二进制中的3位对应八进制的1位
例如:
比如二进制`1 0 1 1 1 0 1`
这里拆除三份
1 1x2^0=1
0 1 1 0x2^2+1x2^1+1x2^0=3
1 0 1 1x2^2+0x2^1+1x2^0=5
转化为八进制为:135
- 二进制转化十六进制
这里的话转换十六进制也是一样
二进制的每4位的对应十六进制的1位
比如二进制`1 1 0 1 0 1 0 1`
这里拆除二份
1 1 0 1 1x2^3+1x2^2+0x2^1+1x2^1=d
0 1 0 1 0x2^3+1x2^2+0x2^1+1x2^1=5
转化为十六进制为:d5
- 十进制转二进制
这里用一张图直接说明一下:
按照这个方法除便可以了。
3.原码 反码 补码
- 这里如果是正数的的话都是相同的
例如:
int a=8
这里我们先了解常见变量类型对应bit
变量类型 字节 bit
int 4 32
char 1 8
short 2 16
double 8 64
float 4 32
long 4 32
long long 8 64
因为一个二进制对应一个bit位
这里我们创建一个变量:
int a=4
int类型有32个bit
,转换为二进制为
原码 00000000 00000000 00000000 00000100
反码 00000000 00000000 00000000 00000100
补码 00000000 00000000 00000000 00000100
- 但如果是负数,那么就存在区别了,这里二进制的最高位代表正负,1代表负,0代表正
这里创建一个负数
int a=-6
转化为二进制
原码 10000000 00000000 00000000 00000110
反码 11111111 11111111 11111111 11111001
//反码除开符号位,其他按位取反
补码 11111111 11111111 11111111 11111010
//补码+1
这里是原码转化为补码的步骤,补码转化为原码也是相同的。
补码 11111111 11111111 11111111 11111010
10000000 00000000 00000000 00000101
//除开符号位,其他按位取反
原码 10000000 00000000 00000000 00000110
//+1
4.位移操作符<<和>>
<< 左移操作符
>> 右移操作符
左移操作符
移位规则:左边抛弃、右边补0
#include <stdio.h>
int main()
{
int num = 10;
int n = num<<1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
而右移操作符则会保留符号
左边⽤原该值的符号位填充,右边丢弃
#include <stdio.h>
int main()
{
int num = -1;
int n = num>>1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
最后的结果是: