学习记录:第二周day02笔记
进制转换
1、为什么使用二进制、八进制、十六进制?
因为目前CPU只能识别高低两种电平,只能对二进制数据进行计算
二进制虽然能够直接别计算机识别但是不方便人去书写和记录,因此就把二进制数据转换成八进制,方便记录到文档中
随着CPU的位数的不断增加(目前已经到64位),八进制不再能够用满足需求,因此发展出现在的十六进制,由于历史原因八进制还不能退出历史舞台
2、十进制=》二进制
求余法:
127 % 2 1 低位
63 % 2 1
31 % 2 1
15 % 2 1
7 % 2 1
3 % 2 1
1 % 2 1
0
0111 1111
求权法:(从高位到低位凑)
134
128 64 32 16 8 4 2 1
1 0 0 0 0 1 1 0
练习 :73 62 121 49
0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1
练习2:输入一个正整数m,然后输入n(n>=2),显示m的n进制结果
3、二进制转十进制
每位乘以位权,再求和
4、二进制转八进制
从低位起,每三个二进制位对应一个八进制位
二进制:10 101 110 101 101
八进制:2 5 6 7 4
5、二进制转十六进制
从低位开始,每四个二进制位对应一个十六进制位
二进制:10 1011 1011 1100
八进制:2 B B C
6、不同进制在程序中的显示
在C代码中,以0开头的数据是八进制数据,以0x/0X开头的十六进制数据
%x 让数据以十六进制显示
%o 让数据以八进制显示
%#x %#o 显示出数据对应的进制前缀
7、原码、反码、补码
原码:最高位表示数据正负的二进制
反码:
正数的反码就是原码
负数的反码:与原码符号位不变,其他位按位取反
补码:(所有数据在计算机中,都是以补码形式存储)
正数的补码就是原码
负数的补码:反码+1
-127
1111 1111 原码
1000 0000 反码
1000 0001 补码
8、补码如何转化为数据
先确定有符号还是无符号
1、无符号\有符号的最高位为0,补码直接转成十进制
2、有符号的最高位为1
a、补码-1,得到反码
b、符号位不变,其余位按位取反,得到原码
c、原码转十进制
1111 1111 补码
1111 1110 反码
1000 0001 原码
位运算符(针对补码)
& | ~ ^ << >>
A&B 按位与
1010 1110 A
0111 1100 B
0010 1100 C
~A 按位求反
1010 1110 A 0xAE
0101 0001
A ^ B 按位异或 相同为零,相异为一
1010 1110 A
0111 1100 B
1101 0010
A<<n 按位左移,低位补0
1010 1110 A<<3
0111 0000
A>>n 按位右移,高位补符号位
1010 1110 A>>3
1111 0101
练习2:输入一个整数,把它的4-7为设置为1010,其余位不变
num: 10 1000 1011 1101
11 1111 0000 1111 &
10 1000 0000 1101 把num4-7清零
00 0000 1010 0000 |
10 1000 1010 1101
函数:Function
一段具有某一项功能的代码集合,是C语言管理代码的最小单位
把代码封装成一个个函数,方便管理和调用代码
1、函数分类
(1)标准库函数
C语言标准委员会以函数形式提供的一些基础功能,都被封装在libc.so库中,并且分在了不同的文件中,需要使用时,只要把对应的头文件导入即可(例如stdio.h),然后通过具体的 函数名(参数) 即可完成调用
功能:获取自1970-1-1 0:0:0到调用时总共过了多少秒
用法:time_t sec=time(NULL)
功能:获取一个随机数
注意:目前任何编程语言和系统都没有真正的随机数,C编译器是把0~极大值范围的数值打乱后,存储到一块固定内存中,然后从里面取所谓的随机数
void srand(unsigned int seed)
功能:种随机数种子,设置从随机数内存的某个位置开始取随机数,为了实现伪随机的效果,seed一般使用time(NULL)来设置
int system(const char *command)
执行系统命令command
例如:system("clear");
练习3:获取10个范围[100,1000]之间的随机数,获取次数不能超过10次
rand()%901+100
[a,b] rand()%(b-a+1) +a
练习4:双色球规则:6个红球范围1-33 1个篮球范围1-16通过程序产生一组随机的中奖号码:红球不能重复
(2)系统函数(系统调用)
是操作系统以函数形式提供的一些功能接口
(3)第三方库函数
一些开源或收费的第三方代码
GitHub
md5
JSON 序列化和反序列化
glog 谷歌日志系统
XML 配置文件解析系统
(4)自定义函数
为了更好地管理代码,减少代码冗余
函数声明(函数原型):
目的是为了为了告诉其他的调用者(包括main函数),该函数的调用格式;
格式
返回值类型 函数名(形参类型1 形参名,形参类型2 形参名...);
1、C语言中函数名一般全部小写,可以用下划线分割
2、如果不需要参数时,建议写上void
3、C语言中不允许同名函数的出现
函数定义:
函数的具体实现
返回值类型 函数名(形参类型1 形参名,形参类型2 形参名...)
{
}
函数调用:
函数名(实参1,实参2...);
使用函数需要注意:
函数隐式声明:
在函数调用前没有任何该函数的声明或定义(定义在其他位置),那么会产生隐式声明
要避免产生隐式声明,就需要在函数调用前有函数声明或函数定义
注意:如果在函数调用前完成了函数的定义,那么函数声明可以省略
作业1:封装素数
作业2:输入两个日期(yyyy-mm-dd),计算两个日期间隔的天数
作业3:实现一个函数,判断一个整数是否是回文数,调用该函数显示出1亿~10亿之间的所有回文数
作业4:计算出100的阶乘