进制分为四种
1:二进制
2:八进制
3:十进制
4:十六进制
1.默认就是10进制
int num = 12;
2.在前面加上一个0就代表八进制
int num1 = 014;
%d是以十进制的方式输出一个整数
printf("%d\n", num1);
%o是以八进制的方式输出一个整数
printf("%o\n", num);
在数值前面加上0b就代表二进制
int num2 = 0b1100;
printf("%d\n", num2);
在数值前面加上0x就代表十六进制
int num3 = 0xc;
printf("%d\n", num3);
%x是以十六进制的方式输出一个整数
printf("%x\n", num);
口诀:不看你怎么存,只看你怎去取
进制的转换:
N位二进制的取值范围
1位 取值范围 0~1 0~2的1次方-1
2位 取值范围 0~3 0~2的2次方-1
3位 取值范围 0~7 0~2的3次方-1
n位 取值范围 0~2(n)-1
十进制 -> 二进制
转换原理:除2取余 倒序读取
二进制 --> 十进制
转换原理:乘以2的幂数(幂数从0开始), 然后相加
二进制转换为八进制 进制越大表示的位数就越短
规律:三个二进制位代表一个八进制位
因为3位的最大取值是7 而八进制是逢八进一
二进制转换为十六进制
规律:四个二进制位代表一个十六进制位
因为4位的最大取值是15, 而十六进制是逢十六进一
原码补码和反码
12的二进制
12在内存中存储的是它的补码
00000000 00000000 00000000 00001100
正数的特点:(三码合一) 正数的原码就是TA的反码就是TA的补码
-12
二进制的最高位我们称之为符号位
如果符号位是0代表是一个正数,
如果符号位是1代表是一个负数
10000000 00000000 00000000 00001100 (-12的原码)
11111111 11111111 11111111 11110011(反码, 符号位不变其它位取反)
11111111 11111111 11111111 11110011
+00000000 00000000 00000000 00000001
_____________________________________________
11111111 11111111 11111111 11110100(补码 , 反码+1)
结论:无论正数负数在内存中存储的都是补码
~ 按位取反
特点: 0变1 1变0
<< 左移
a << n 把整数a的二进制位往左边移n位
移出的位砍掉,低位补0, 发现左移会把原有的数值变大
>> 右移
a >> n 把整数a的二进制位往右边移n位
移出的位砍掉, 缺少的以为最高位是0就补0是1就补1
& 按位与
特点:只有对应的两位都是1才返回1 否则返回0
口诀: 一假则假
规律:任何数按位与上1结果还是那个数
| 按位或
特点:只要对应的两位其中一位是1就返回1
口诀:一真则真
^ 按位异或
特点:对应的两位不相同返回1 相同返回0