一、进制转换:
为什么要使用二进制、八进制、十进制、十六进制?
因为现在的CPU只能识别高低电平,只能对二进制的数据进行计算。虽然二进制的数据可以直接被CPU识别计算,但是不方便书写和记录。
把二进制的数据转换成八进制是为了方便记录到文档中。由于CPU位数的发展不断增加,由8位逐渐发展到现在的64位,因此八进制就不能满足需求了,所以发展出了十六进制。
但是由于历史原因,八进制还不能完全淘汰。
十进制转二进制:
1.求余法(其他进制通用,对对应的进制求余):用2对数据求余,然后继续对商求余,直到商为0结束,该过程中产生的余数就是该数据的二进制(倒序输出)
2.求权法:从高位到低位数据减去2^(n-1)次方,可减则n位为1否则为0,直到数据减为0
手算:86 72 112 176 ——01010110 01001000 01110000 10110000
练习1:输入一个正整数m,输入n(n>=2),显示m的n进制,超过10的用字母显示(笔试真题)
#include#include int main(int argc,const char* argv[]) { int m=0,n=0,temp=0,step=0,i=0; printf("Please input a m:n"); scanf("%d",&m); printf("Please input n:n"); scanf("%d",&n); for(i=0;temp 0) { arr[step]=m%n; m=m/n; step++; } for(int j=step-1;j>=0;j--) { if(arr[j]>=10) printf("%c ",55+arr[j]); else printf("%hhd ",arr[j]); } return 0; }
转十进制:每位的2^(n-1)求和
二进制转八进制:从低位开始,每三位二进制位对应一位八进制
先划分位:1001010101110b ----001 001 010 101 110 八进制:11256
二进制转十六进制:从低位开始,每四位二进制位对应一位十六进制
在C语言中,以0开头的数是八进制数,例如 %c 072中072为8进制数,应该先转换为十进制。以0x开头的数是十六进制。
%o:以八进制显示数据
%x:以十六进制显示数据
%#o/x:可以把数据对应的前缀显示出来。要求输出的类型不一样结果可能不同(%hhd %hd)
二、原码、反码、补码:
原码:数据的二进制
反码:正数的反码就是它的原码,负数的反码就是它原码的除符号位外,其他位按位求反
补码:正数的补码就是它的原码,负数的补码是它的反码加一。
注意:内存中所有数据的存储都是以补码形式存储的
负数转换成二进制、符号位不变,其余按位取反,反码加一得到补码
-127在内存中:原码1111 1111反码1000 0000 补码1000 0001
补码转数据:1.无符号补码直接转换成十进制2.有符号,最高位是0为有符号正数,直接转换成十进制;最高位是1为有符号负数:补码减一得到反码,反码除符号位按位取反得到原码后再转换为十进制数
三、位运算符:
按位与& A & B 按位相与
按位或| A | B按位相或
按位求反~ ~A
异或^ A^B 按位异或
按位左移<< A< 按位右移>> A>>n把A的补码右移n位,右边丢弃,左边补符号位 ——先转换再算 左移一次相当于×2,右移一次相当于÷2. int num=3; num<<12; printf(“%dn”,num); num=num<<12与num<<12 练习2:输入一个整数,把它的4到7位设置为1010,其他位不能变 1 0110 1011 0111 0101 num 1 0110 1011 1010 0101 (num & ~(0xf << 4)) | (0xA << 4) 一段具有某项功能的代码,是C语言中管理代码的最小单位,把代码封装成一个个函数,可以方便管理和调用代码。 函数的分类:标准库函数、系统函数、第三方库函数、自定义函数 由C语言标准委员会为C语言以函数的形式提供的一些基础功能,被封装libc.so中,使用时需要包含对应的头文件,通过 函数名(实参)方式即可调用标准库中的函数 libm.so #include time_t time(time_t *tloc); 功能:返回自1970-1-1 0:0:0到函数执行时总共过了多少秒 time_t sec = time(NULL) #include int system(const char *command); 功能:执行系统命令 system(“clear”) int rand(void) void为空 功能:返回一个随机数 int num = rand() void srand(unsigned int seed); 功能:种随机种子 srand(time(NULL)) [a,b] =rand()%(b-a+1)+a 练习3:获取十个范围在100~1000之间的随机数,循环不超过十次 练习4:双色球----红球一共6组,每组从1-33中抽取一个,六个互相不重复,蓝球从1-16抽取一个,随机产生一组双色球号码 1 #include 2 #include 3 #include 4 int main(int argc,const char* argv[]) 5 { 6 int redball[6]={0},blueball=0,step=0,i=0,j=0; 7 srand(time(NULL)); 8 blueball=rand()%16+1; 9 while(i<6) 10 { 11 step=rand()%33+1; 12 for(j=0;j
13 { 14 if(redball[j]==step) 15 { 16 break; 17 } 18 } 19 if(j==i) 20 { 21 redball[i++]=step; 22 } 23 } 24 for(i=0;i<6;i++) 25 { 26 printf("%02d ",redball[i]); 27 } 28 printf("%02d ",blueball); 29 return 0; 30 } 系统函数: 是操作系统以函数接口形式提供的一些列功能,但是它不是真正意义上的函数。内存管理、文件管理、文件IO、信号处理、进程管理、进程通信、线程管理、线程同步、网络通信 第三方库函数: 由第三方提供的开源或者收费的代码库 MD5加密算法/Json序列化、反序列化/Xml配置文件解析 自定义函数: 为了更好地管理自己的代码,减少代码冗余,把代码封装成函数形式。 隐式声明:在调用函数时,前面没有出现过该函数的声明或定义,就会产生隐式声明的警告,参数会根据实参来猜测,返回值会猜测为int类型,反正不要产生隐式声明:只要在调用前有声明或定义即可 返回值类型 函数名(形式参数:类型1 参数名,类型2 参数名);//封号记得加 注意:1.C中函数名一般全小写,可以用下划线分割2.如果返回值不需要,可用void,不能不写3.如果不需要形参,建议也写void 4.如果形参类型相同,每个都要加类型名,与定义变量时不同 复制声明,去掉封号加上大括号 返回值类型 函数名(形式参数:类型1 参数名,类型2 参数名) { //函数体 return (val);//val根据返回值类型,return如果是void也可以写,意义是结束} 注意:1.在函数调用之前有函数定义,则函数声明可以省略 2.函数的返回值会返回在调用位置,可以立即显示,也可以使用变量记录下来 3.一个函数建议最好不要超过50行代码 1、实现一个函数,判断是否是素数,调用它显示100~1000以内所有的素数 2、输入两个日期(yyyy-mm-dd),计算两个日期间隔多少天 3、实现一个函数,判断一个整数是否是回文数,调用它显示1亿-10亿的所有回文数 4、输入一个整数,显示它的补码 5、计算出100的阶乘 四、函数:
标准库函数:
#include
作业:
#include
#include
#include
#include
#include



