




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、位运算将一个十进制数变为二进制:除法比如将整数2020 除 2 余 010 除 2 余 05 除 2 余 12 除2 余 01所以十进制的20变为二进制的值为: 10100将一个二进制数变为十进制:乘法比如将二进制10100 变成十进制数 。算法:每位上的数乘以2的n次幂 ,这个n次幂是该数所在位(从第0位开始) , 然后求和。1*24 + 0*23 + 1*22 + 0*21 + 0*20 = 20所以二进制10100变为十进制值为20位运算符的含义 : 位运算是指进行二进制位的运算。按位与运算 &按位或运算 |按位异或运算 求反运算 左移运算 <<右移运算 >&g
2、t;注意:运算对象只能为整型或字符型数据.1.按位与&格式:x&y规则:对应位 均为1时才为1,否则为0。 例如,3&9=1: 0011 & 1001 0001=1 参考用途:取(或保留)1个数的某(些)位,将某位或某些位置02.按位或|格式:x|y规则:对应位均为0时才为0 ,否则为1。例如,3|9=11: 0011 | 1001 1011=11 参考用途:将某(些)位置13.4.求反 格式: y规则:各位翻转,即原来为1的位变成0,原来为0的位参考用途:间接地构造某个数,其非指定位都为1,以增强程序的可移植性5.符号位会溢出,整数可能变负数,负数可能变整数如
3、一个数补码的符号位为1下一位为0,逻辑左移一位变成正数一个数补码的符号位为0下一位为1,逻辑左移一位变负数6.按位右移>> 格式:x>>位数规则:使操作数的各位右移,移出的低位舍弃;高位:对无符号数和有符号中的正数,补0;有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。说明x和“位数”等操作数,都只能是整型(允许字符型数据)。除按位取反为单目运算符外,其余均为双目运算符。参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。 例如,5<<2=20:0101 10100, (一般情况,正整数左移n
4、相当于乘以2的n次方) 20>>2=5:10100 00101。(一般情况,正整数右移n相当于除以2的n次方)例题:1. 有个int型变量n,判断它第6位上是1还是0int temp = 1<<5 ; /创建一个临时变量值为:000100000n = n & temp ; /屏蔽n的除第6位的其他位 if(n) /如果n的第6位为1,则n非0 putchar(1); else putchar(0);2.将一个int变量的第7位置1(1<<6) | n3.将一个int变量的第8位置0( (1<<7) ) & n4.将一个int变量的
5、第9位取反(1<<8) n这种类似的对第几位操作:一般方法先得到一个中间值(用1左移n位,看情况需不需要取反)再看用&, | ,题:从键盘上输入1个整数给int变量num,输出由811位构成的数(从第0号开始编号)基本思路:2种方法1.截取811位的数,位移到03位a)构建811位上为1其余为0的数b)位与输入数c)得到的结果右移8位2.先将811位移到03位,截取03位a)输入数右移8位b)构建03位为1其余为0的数c)位与,得到结果仔细考察构建的辅助数(位与时用到的数,因为起到了“采用某些位,无视,即屏蔽其他位”的左右,所以也叫做mask),构建mask的复杂程度,这里
6、采用方案2main() int num, mask; printf("Input a integer number: "); scanf("%d",&num); /*将num右移8位,将811位移到低4位上*/ num >>= 8; /*间接构造1个低4位为1、其余各位为0的整数*/ mask = ( 0 << 4); / mask = 000.001111 /打印结果 printf("result=0x%xn", num & mask); 程序运行情况: Input a integer num
7、ber:1000 result=0x3程序说明: ( 0 << 4)按位取0的反,为全1;左移4位后,其低4位为0,其余各位为1;再按位取反,则其低4位为1,其余各位为0。这个整数正是我们所需要的。题目:从键盘上输入1个正整数给int变量num,按二进制位输出该数。#include <stdio.h>/思路:从最高位开始,每次截取每一位数,打印出来int main()int num;int i;printf("请输入一个整数:n");scanf("%d",&num);for(i = sizeof(void *)*8 - 1
8、; i >= 0 ;i-) /求系统多少位: sizeof(void *)*8printf("%d", (num>>i) & 1 );printf("n");return 0;const什么是const?常类型是指使用类型修饰符const说明的类型,常类型的变量的值是不能被改变的。const是C语言的一种关键字,起保护作用,防止意外的变动的作用!可以修饰变量,参数,返回值。const可以提高程序的健壮性。2、cons有什么主要的作用?1. const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令2. 可以
9、保护被修饰的东西,防止意外的修改,增强程序的健壮性;3. 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。4. 可以节省空间,避免不必要的内存分配。注意以下的区别:int a = 10;const int *p = &a; /修饰 *p值不可变,但是p的值可改变/a的值可变int * const p = &a; / 修饰 p的值不可变,*p值可变 const int *const p ; /修饰 p ,*p 的值都不可变const 到底修饰谁,只要看const 在 * 的前后注
10、意:const int *p = &a; 和int const *p = &a; 一样const int *const p;和int const * const p = &a; 一样试着想想 string 的4个函数 哪些地方需要加const strcpy函数原型:char * strcpy(char * dest, const char * src);源地址字符串首地址指针 用const修饰,防止 在strcpy内部意外改变源地址空间的值strcmp函数原型:int strcmp(const char * str1,const char *str2);仅仅只是比较2个
11、字符串空间的值,不需要改变里面的值,所以应防止被修改枚举 enum如果一个变量只有几种可能的值,可以定义为枚举类型。所谓的枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。声明枚举类型用enum关键字,如:enum weekdaysun,mon,wed,thu,fri,sat;声明了一个枚举类型 enum weekday,可以用此类型来定义变量如:enum weekday workday,week_end;workday 和 week_end 被定义为枚举变量,他们的值只能是sun到sat之一,也就是说他们只能被赋值从sun 到 sat 之间的一个值如:workday = m
12、on;week_end = sun; 像结构体一样也可以以在声明的时候定义变量如:enum weekdaysun,mon,tue,wed,thu,fri,satworkday,week_end ;其中的sun、mon、.、sat 等称为枚举元素或枚举常量。他们是用户定义的标示符。这些标示符并不自动地代表什么含义。例如,不因为写成sun,就自动的代表“星期天”。其实不写sun 而写成sunday 也可以。用什么标示符代表什么含义,完全由程序员决定,并在程序中做相应的处理.说明:1)枚举元素是常量,不是变量,不能对他们赋值如:sun = 1; /不能赋值mon = 2; /不能赋值2)枚举常量是有
13、值的,如果没主动赋值,那默认值从第一个枚举常量开始赋值0,1 ,2 .也可以在声明枚举类型时,给枚举常量赋值,如:enum weekdaysun=7,mon=1,tue,wed , thi , fri , satworkday ,week_end;定义sun 为7 , mon = 1 ,以后顺序加1, sat的值为63) 给枚举变量赋值,必须用枚举类型的值,可以用枚举元素赋值,如果想用整数赋值,必须强制转换,如:workday = 2 ; /error,这样赋值,类型不同workdat = (enum weekday)2 ; /强制转换,可以。但是,不推荐例题:#include <std
14、io.h>enum Error_CodeOUT_OF_MEMORY, INSUFFICIENT_DISK_SPACE, LOGIC_ERROR, FILE_NOT_FOUND ;int main(void)enum Error_Code errn;errn = OUT_OF_MEMORY;switch(errn)case OUT_OF_MEMORY:printf("内存越界n");break;case INSUFFICIENT_DISK_SPACE:printf("磁盘空间不足n");break;case LOGIC_ERROR:printf(&q
15、uot;逻辑错误n");break;case FILE_NOT_FOUND:printf("文件没找到n");break;return 0;/*注释:系统里有个全局枚举变量errno(头文件errno.h),当程序运行出错,系统就会将错误值赋值给errno,我们可以调用perror函数来打印错误信息,perror函数会像上述代码一样去判断枚举变量error的打印相应的出错信息。*/enum AAA, BBB, CCC;相当于#define AAA 0#define BBB 1#define CCC 2宏和枚举的区别(#define VS enum)宏和枚举之间的差
16、别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不 存在了。而枚举是在程序运行之后才起作用的, 枚举常量存储在数据段的静态存储区里 。宏不分配内存空间,枚举变量需要分配内存空间。但也不能就此说宏比枚举好,如果需要定义非常多的常量,用一条enum .明显比一大堆define更清晰,可读性强 。枚举也可以用来定义一些特殊类型,比如Bool,如: enum typeFALSE,TRUE bool;联合体(共用体)union定义: 1)联合体是一个结构; 2)它的所有成员相对于基地址的偏移量都为0; 3)此结构空间要大到足够容纳最"
17、;宽"的成员; 4)其对齐方式要适合其中所有的成员(联合体大小一定是内存对齐大小的倍数);当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。#include <stdio.h>union union_name int i; char a2;x;int mai
18、n(void) x.a0=10; x.a1=1; printf("%dn",x.i); return 0;输出结果266注释:上面结果是在 小端系统时。若是大端系统,则不同。Linux和windows都是小端系统:低地址存数的低位相反就是大端。typedef 与 define#define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不管含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。结尾没有; .typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名.要用; 结尾。 typedef int * myint;
19、 与 #define myint int * 作用都是用myint代表 int * ,但是二者不同,正如前面所说 ,#define在预处理 时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。也就是说: #define pint int * pint a; /相当于int * a; 只是简单的宏替换 typedef int* myint; myint a; /a为指向int的指针,typedef为int* 引入了一个新的别名.注意:sturct studentint num; stu; /这里的stu是变量typedef sturct student
20、int num; stu,*pstu ; /这里的stu不是变量,是struct student类型的别名 /pstu 是struct student * 类型的别名创建一个指向整形元素、3列的二维数组的指针int (*p)3; /将指针p去掉,剩下的就是指针类型typedef int (*TYPE)3; /重命名指针类型:int (* )3创建一个指向返回类型char * 带2个参数(int ,char)的函数指针char * (*p)(int ,char); /去掉p,剩下的就是指针类型typedef char * (*FUN)(int,char); /重命名指针类型:char * (*)
21、(int ,char)例题:#include <stdio.h>#include <string.h>typedef int (*FUN)(const char *); /重命名类型为:int (*)(const char *)int main()/*FUN是类型,用来创建变量的*/FUN f; /f 是指向strlen函数一样类型的指针f = (FUN)strlen; int len = f("hello"); /相当于调用strlenprintf("%dn",len);/*注释:上面采用了tpedef,代码看起来很简洁,而下面
22、没采用typedef, 强转 代码很长,不易阅读*/*下面指针p是指向strcpy函数一样类型指针*/char* (*p)(char*,const char*)=(char* (*)(char*,const char *)strcpy;char s122;char s222 = "hello world"p(s1,s2); /相当于调用strcpyprintf("s1 = %sn",s1);return 0;经常会将一些过长的类型 重命名如下:void (* signal(int signo,void (*func)(int) )(int);等价于下面2
23、行typedef void (*FUN)(int);FUN signal(int signo,FUN func); 下面例题是一个简单的函数映射:#include <stdio.h>#include <string.h>typedef void (*FUN)(); /重命名指向 无返回值无参的函数的指针的类型struct mapchar * str; /保存命令的字符串名FUN fun; /保存函数地址;void ls()printf("this is lsn");void cd()printf("this is cdn");vo
24、id mv()printf("this is mvn");void rm()printf("this is rmn");void cp()printf("this is cpn");int main(void)struct map arr100 = "ls",ls,"cd",cd,"mv",mv,"rm",rm,"cp",cp,NULL,NULL;char buf22;int i;while(1)i = 0;bzero(buf,22);
25、 /清空printf("请输入命令:");scanf("%s",buf);if(!strcmp(buf,"exit") /如果输入exit 结束程序return 0;while( arri.str != NULL) /循环比较,比较数组元素中的字符串if( !strcmp(arri.str,buf) ) (arri.fun)(); break;i+;return 0;动态分配malloc calloc作用: 程序员手动在内存的堆里面申请一块空间函数原型: void *calloc(size_t nmemb, size_t size);
26、void *malloc(size_t size);举例:1.想要手动分配一块整形空间:int * p = (int *)malloc(sizeof(int);int *p = (int *)calloc(1,szieof(int);2. 想要分配一块5个元素的整形数组空间int * p = (int *)malloc(5*sizeof(int) ;int * p = (int *)calloc(1,5*sizeof(int)int * p = (int *)calloc(5,sizeof(int);3. 想要分配一个结构体类型的空间struct studentint a;char b;str
27、uct student * p = (struct student *)malloc(sizeof(struct student);struct student * p = (struct stduent *)calloc(1,sizeof(struct student);释放malloc calloc空间 函数原型:void free(void *ptr);举例:int *p = (int *)malloc(szieof(int);free(p); /释放动态分配的空间下面4个经典的指针、内存的例子注意:指针的指向:指针变量里面存储的是谁的空间的地址,就指向谁1.#include <s
28、tdio.h>char * getmemory();int main()char * p;p = getmemory();printf("%sn",p); /打印的空间已被释放return 0;char * getmemory()char str22; /这个空间空间由系统创建与释放,函数结束结束释放scanf("%s",str);return str;2.#include <stdio.h>#include <malloc.h>#include <string.h>char * getmemory();int main()char * p;p = getmemory();printf("%sn",p);return 0;char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 4 Newspapers教学设计-2025-2026学年初中英语牛津上海版2008八年级第二学期-牛津上海版试用本
- 第2课 我会自己洗水果教学设计-2025-2026学年小学劳动鄂教版一年级上册-鄂教版
- 制造业生产部长职责指南
- 2025年环保型压路机租赁及绿色施工安全防护协议
- 2025年新能源汽车长途运输居间代理服务合同
- 关于个人简单的借款合同范本5篇
- 2025年度物流配送中心自动化搬运系统采购合同
- 2025年地铁车站智能化装修设计与施工一体化合同
- 2025年度航空地面服务人员劳动合同范本
- 数学一年级上册习题设计计划
- 国家电网公司招聘高校毕业生应聘登记表
- GA 1801.4-2022国家战略储备库反恐怖防范要求第4部分:火炸药库
- 消化道出血的内镜治疗
- GB/T 4623-2006环形混凝土电杆
- GB/T 36572-2018电力监控系统网络安全防护导则
- 甲状腺危象教学课件
- GA/T 970-2011危险化学品泄漏事故处置行动要则
- 外科学-第三章-水、电解质代谢紊乱和酸碱平衡失调课件
- PICC置管后常见并发症的处理教育课件
- 督查督办培训课件
- 2023全国大学生数学建模竞赛D题
评论
0/150
提交评论