0810枚举与位运算

枚举

   枚举(Enumeration)是一种用户自定义的数据类型用于定义一组具有离散值的符号常量。枚举使得代码更加可读和易于理解,提高了代码的可读性和可维护性。

//枚举的语法
enum 枚举名称 {
    值1,
    值2,
    值3,
    ...
};

注意,定义枚举类的关键字是enum,而不是Enum,所有关键字都是小写的!

在定义枚举项时,多个枚举项之间使用逗号分隔,最后一个枚举项后需要给出分号!

 枚举成员的类型
   枚举的成员默认情况下都是整数类型,通常是int类型。这意味着每个枚举成员都会被赋予一个整数值,并且这些整数值从0开始递增。如果没有显式地指定枚举成员的值,那么第一个成员的值为0,第二个成员的值为1,依此类推。同时,可以显式地为枚举成员指定一个整数值,这个值可以是正整数、负整数或零。

以火锅店中的大小火为例
enum fire 
	{
	  LITTLE_FIRE,//默认第一个为0
	  MIDDILE_FIRE, //1
	  LARGE_FIRE, //2
	}; 

整体代码可以写成:

#define LITTLE_FIRE  1 
	#define MIDDILE_FIRE 2 
	#define LARGE_FIRE   3
	
	main()
	{
	   //
	   int n;
	   scanf("%d",&n);
	   switch(n)
	   {
	      //case 1:
		  case LITTLE_FIRE: 
		      printf("---little fire!---\n");
			  break;
		 // case 2:
		 case MIDDILE_FIRE: 
		      printf("---middile fire!---\n"); 
			  break; 
		 //case 3:
		 case LARGE_FIRE:
		      printf("---large fire!---\n"); 
			  break;
		
	   }
	}
总结:


    1. 枚举是一种枚举类型 
    2. 枚举中逐个列举的值,默认是从0开始  
       如果有给定的值,则后续没有给值的 枚举元素 依次 加1 
    3. 枚举类型的 本质 实际是一个int类型的数据,占4个字节。 
    4. 枚举类型的变量 与 整型类型的变量通用的 (意思是可以通过手动赋值)
    5. 与 宏定义对比  
       区别:
           使用阶段不同 --- 宏定义 --- 预处理阶段 
                            枚举   --- 编译阶段 要检查语法 
                                            运行阶段 参与代码运行

 
 举例:输入一个数字,打印出对应的星期几。

 enum days
 {
     MONDAY=1,
     TUESDAY,
     WEDNESDAY,
     THERSDAY,                     
     FRIDAY,
     SATURDAY,
     SUNDAY,
 
 };
 int main()
 {
     int k;
     scanf("%d" ,&k);
     switch(k)
     {
     case MONDAY:
         printf("Monday\n");
         break;
     case TUESDAY:
         printf("Tuesday\n");
         break;
     case WEDNESDAY:
         printf("Wedesday\n");
         break;
     case THERSDAY:
         printf("Thersday\n");
         break;
     case FRIDAY:
         printf("Friday\n");
         break;
     case SATURDAY:
         printf("Saturday\n");
         break;
     case SUNDAY:
         printf("Sunday\n");
         break;
     }
     return 0;
 }

位运算:

概述:

我们知道,计算机中的数在内存中都是以二进制形式进行存储的 ,而位运算就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高,在程序中尽量使用位运算进行操作,这会大大提高程序的性能。

位运算符号:

运算符的优先级:

在这里我们需要特别注意优先级为1的运算符,因为他们的结合性是从右往左结合的。还有就是同一优先级要先看结合性

举例:

	 
&  与运算  --- 位运算中    //清0  
   运算规则:
      一假则假    
  eg:
      0xaa 
	  1010 1010 
	  0011 0011 &
	  ---------
	  0010 0010 0x22 


|  或运算                 //置1 
    运算规则:
      一真则真 
   	  
   
	  1010 1010   // 0xaa 
	  0011 0011 & // 0x33 
	  ---------
	  1011 1011  //0xbb 


~ 取反
   运算规则:
     真假相对 
	 
   ~0xaa 
     1010 1010   // 0xaa 
	 0101 0101   //0x55
	 


^ 异或 
  运算规则:
  相同为 0
  不同为 1 
  1010 1010   // 0xaa 
  0011 0011 ^ // 0x33 
  ---------
  1001 1001 //0x99

应用:

左移一位实现a*2 右移一位实现a÷ 2 

a < < 1 ≡ a ∗ 2 
a > > 1 ≡ a / 2 

利用运算符实现交换两位整数,在这里说明一下,浮点型不能做位运算,因为其内部有小数,储存方式和int型不一样。

 void swap(int &a,int &b){
      a ^= b;
      b ^= a;
      a ^= b;
  }

练习:1.统计int类型数据中1的个数

 int main(int argc, const char *argv[])
 {
     int a=121314;
     int k=0;
 
     for(int i=0;i<32;i++)
     {
 
         if(a&(1<<i))
         {
             k++;
         }
     }
     printf("%d\n",k);
     return 0;


2.实现一个循环左移 
 

int main(int argc, const char *argv[])
{
    int a=1;
    int k=0;
    scanf("%d",&k);

    for(int i=0;i<k;i++)
    {
    
        if(1&(a>>31))
        {
            a=(1|a<<1);
         }
        else
        a=a<<1;
    }
    
    printf("%#x\n",a);
    return 0;
}

malloc

malloc是C语言标准库函数之一,用于动态内存分配。当你需要程序运行期间根据需要创建数据结构并管理其大小时,可以使用它。malloc函数接收一个整数参数,表示要分配的字节数,返回一个指向新分配内存的指针。如果分配成功,该指针非空;若失败,返回NULL,并可能导致程序出错。

void *malloc(size_t size); 
   功能: 
       在堆上开辟一块空间 
   参数:
       size //表示申请的空间的大小,单位字节 
  返回值:
      成功 返回 申请到内存空间的地址
	  失败 返回 NULL

free

//释放函数 
   void free(void *ptr);
   释放之前申请的堆上的空间 
   参数:
       ptr 一定是之前申请到堆上空间的地址 
     
     free释放后的空间 
     1.一般不再使用 
     2.指向这块空间的指针 --- 是个野指针 
     3.free之后对应空间上的内容 ---也不要使用 

malloc函数和free函数头文件

#include<stdlib.h> 或者 #include<malloc.h>

注意:

     1. 成对出现 
     2. free只是释放了空间 --- 表示这块空间 又自由了 
         但是 这块空间上的数据 并不会清零
     3. 不要多次free 

应用:在堆上手动申请一个数组,输出并打印出来

 int main(int argc, const char *argv[])
 {
     int i=0;
     int *p=malloc(sizeof(int));//malloc (sizeof(int)*5);
     *p=25;
     int q[5];
     q[0] =*p;
     for(i=0;i<5;i++)
     {
     scanf("%d ",&q[i]);
     }
     for(i=0;i<5;i++)
     {
     printf("%d",q[i]);
     }                                                       

     return 0;
 }

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值