C语言学习day7-位运算符及函数

it2025-05-17  7

进制转换: 为什么使用二进制、八进制、十六进制: 因为现在的CPU只能识别高低两种电流,只能对二进制数据进行计算。 二进制数据虽然可以直接被CPU计算识别,但是不方便书写、记录,把二进制数据转换为八进制是为了方便记录在文档中。 随着CPU的位数不断的增加,由早期的8位逐渐发展成了现在的64位,因此八进制就不能满足需要了,所以发展出了十六进制。 由于历史原因八进制还不能退出历史舞台(文件的权限 m=4+2+1)

十进制转二进制(其他进制): 求余法:用2对数据进行求余,然后用商继续求余,直到商为0结束,过程中产生的余数就是该数据的二进制(逆序) 127 %2 1 63 %2 1 31 %2 1 15 %2 1 7 %2 1 3 %2 1 1 %2 1 0 01111111 求权法:数据 - 2^(n-1) 如果可以减,则第n位就是1,否则是0 1 2 4 8 16 32 64 128 手算: 79、63、121、49 练习1:输入一个正整数m,显示该数据的n(n>=2)进制,超过10,则用字母显示。 二进制转十进制:每一位*2^(n-1) 求和 4+8+32+128=172 10101100 二进制转八进制:从低位起每三位二进制位对应一个八进制位 10 101 100 2 5 4 二进制转十六进制:从低位起每四位二进制位对应一个十六进制位 二进制:1010 1110 0010 1101 十六进制:A E 2 D 注意:最大值 + 1 = 最小值 在C代码中,以0开头的都是八进制数据,以0x开头的都是十六进制数据 %x 以十六进制显示数据 %o 以八进制显示数据 %#x、%#o 以对应的进制来显示数据

原码、反码、补码: 原码:数据的二进制 反码: 正数的原码就是它的反码。 负数的反码就是它的原码,符号位不变,其它位按位取反 补码:数据在内存中储存的二进制 正数的原码就是补码。 负数的补码: 1、转换成原码 2、把原码符号位不变,按位求反得到反码 3、把反码+1得到补码

-127 127 11111111 原码 01111111 10000000 反码 01111111 10000001 补码 01111111 补码转原码: 无符号补码直接转成原码,转成十进制。 有符号且最高位是1: 1、补码-1得到反码 2、反码的符号位不变,其它位按位求反得到原码 3、原码转换成10进制 补码:1111111 反码:1111110 原码:1000001 -1

位运算符: A & B:按位相与 0101 1101 0x5d 1001 1001 0x99 -------- 00011001 0x19

A | B:按位相或 0101 1101 0x5d 1001 1001 0x99 -------- 1101 1101 0xdd ~A:按位求反 0101 1101 0x5d 1010 0010 0xa2 A ^ B:按位异或(不同输出1,相同输出0) 0101 1101 0x5d 1001 1001 0x99 -------- 1100 0100 0xc4 A << n: 把A的补码左移n位,左边的丢弃,右边补0 01011101 << 4 11010000 0xd0 A >> n:把A的补码右移n位,右边的丢弃,左边补符号位 11011010 >> 4 0xda 11111101 0xfd 练习2:输入一个整数,把它的4~7设置为1010,其它位保持不变。 n & ~(f<<4) | (0xA<<4) n & ~(f0) | (0xA0) uint32_t numy = 0; scanf("%u",&num); num = num & ~(0xf<<4) | (0xA<<4); printf("%u\n",num); 练习3:输入两个整数,把A的4~7位设置为B的3~6位,其它位不变。 93 A:01011101 50 B:00110010 01100100 01101101 B的4~7位:B & (0xf<<4) 11110000 B的3~6位:(B<<1) & (0xf<<4) 11110000 A & ~(0xf0) | (B<<1) & (0xf0)

函数: function 一段具有某项功能的代码的集合,是C语言管理代码的最小单位。 把代码封装成一个个函数,可以方便管理、调用代码。

函数的分类: 标准库函数: C语言标准委员会为C语言以函数的形式提供的一些基础的功能,被封装在libc.so库中,使用时需要包含头文件,函数名([参数])即可调用 #include <ctype.h> int isalnum(int c); 功能:当c对应的ASCII码表中的字符是数字、字母字符时返回真。 int isalpha(int c); 功能:当c对应的ASCII码表中的字符是字母字符时返回真。 int isdigit(int c); 功能:当c对应的ASCII码表中的字符是数字字符时返回真。 int islower(int c); 功能:当c对应的ASCII码表中的字符是小写字母时返回真。 int isupper(int c); 功能:当c对应的ASCII码表中的字符是大写字母时返回真 #include <stdlib.h> int abs(int j); 功能:返回j的绝对值 以下函数是被封装在libm.so库文件中: double pow(double x, double y); 功能:返回x的y次方 double sqrt(double x); 功能:返回x的平方根 double floor(double x); 功能:返回不大于x的最大整数 double ceil(double x); 功能:返回不小于x的最小整数 double fabs(double x); 功能:返回x的绝对值 #include <time.h> time_t time(time_t *t); 功能:返回自1970-01-01 00:00:00到当前时间过了多少秒 int system(const char *command); 功能:调用系统命令 system("clear"); void srand(unsigned int seed); 功能:设置随机种子 int rand(void); 功能:返回一个随机数 练习4:获取10个[100,1001)的随机数 [a,b) rand()%(b-a)+a rand()%901+100 练习5:随机出一组双色球彩票号码 6红色:1~33,不能重复 1蓝色:1~16 系统函数: 是操作系统以函数接口形式提供一些功能,这些功能包括: 内存管理、信号处理、文件IO、文件管理、进程管理、进程通信、线程管理、线程同步、网络通信 第三方库函数: 一些开源的或者是收费的第三方库代码。 自定义函数:为了更好地管理代码、减少冗余把代码封装成函数。 函数声明:函数声明的目的是为了告诉其他代码,函数的调用格式 (显示声明) 返回值类型 函数名([参数列表]); 1、C语言中的函数名一定要小写,用下划线分隔 2、如果不需要参数,建议写void,不要空着 3、如果不需要返回值写void 隐式声明:当调用函数时还没有定义,也没有声明,编译器会猜测函数的格式,参数列表会根据调用时提供的数据(实参)猜测,返回值猜测成int类型 函数定义: 返回值类型 函数名([参数列表]) { 函数体 return val; } 函数调用:函数名(实参); 函数调用完毕后,返回值会放在调用的位置,可以立即显示,也可以用变量记录下来 注意:1、不能在函数内定义函数 2、如果函数的定义在调用之前,那么函数声明可以省略 作业: 1、实现一个函数,功能是判断整数是否是素数,调用它显示出100~1000之间的素数 2、实现一个函数,功能是判断是否是回文数,调用它显示1亿~10亿的所有回文数 3、计算100的阶乘 4、输入一个整数,显示它的补码 5、给一个20人的班级,抽出上台演讲的顺序,给出每个人是第几个演讲者 6、输入一个密码,验证如果错误重新输入,三次都失败则帐号锁定。
最新回复(0)