c语言位运算:C语言入门之枚举与位运算(1)



在实际问题中有些变量取值被限定在个有限范围内例如个星期内只有 7天年只有十 2个月个班每周有 6门课程等等如果把这些量介绍说明为整型型或其它类型显然是不妥当为此C语言提供了种称为“枚举”类型在“枚举”类型定义中列举出所有可能取值被介绍说明为该“枚举”类型变量取值不能超过定义范围应该介绍说明枚举类型是种基本数据类型而不是种构造类型它不能再分解为任何基本类型

  枚举类型定义和枚举变量介绍说明

  、枚举定义

  枚举类型定义般形式为:

enum枚举名
{
 枚举值表
};

  在枚举值表中应罗列出所有可用值这些值也称为枚举元素

  例如:

enumweekday
{
 sun,mou,tue,wed,thu,fri,sat
};

  该枚举名为weekday枚举值共有7个周中 7天凡被介绍说明为weekday类型变量取值只能是 7天中

   2、枚举变量介绍说明

  如同结构和联合枚举变量也可用区别方式介绍说明即先定义后介绍说明同时定义介绍说明或直接介绍说明设有变量a,b,c被介绍说明为上述weekday可采用下述任种方式:

enumweekday
{
......
};
enumweekdaya,b,c;或者为:enumweekday
{
......
}a,b,c;或者为:enum
{
......
}a,b,c;

  枚举类型变量赋值和使用

  枚举类型在使用中有以下规定:

  1.枚举值是常量不是变量不能在中用赋值语句再对它赋值例如对枚举weekday元素再作以下赋值:sun=5;mon=2;sun=mon;都是

  2.枚举元素本身由系统定义了个表示序号数值从0开始顺序定义为012…如在weekday中sun值为0mon值为1…,sat值为6

{
 enumweekday
 {
  sun,mon,tue,wed,thu,fri,sat
 }a,b,c;
 a=sun;
 b=mon;
 c=tue;
 prf("%d,%d,%d",a,b,c);
}

  3.只能把枚举值赋予枚举变量不能把元素数值直接赋予枚举变量如:a=sum;b=mon;是正确而:a=0;b=1;是定要把数值赋予枚举变量则必须用强制类型转换如:a=(enumweekday)2;其意义是将顺序号为2枚举元素赋予枚举变量a相当于:a=tue;还应该介绍说明是枚举元素不是常量也不是串常量使用时不要加单、双引号

{
 enumbody
 {
  a,b,c,d
 }month[31],j;
 i;
 j=a;
 for(i=1;i<=30;i){
  month[i]=j;
  j;
  (j>d)j=a;
 }
 for(i=1;i<=30;i){
  switch(month[i])
  {
   a:prf("-%c\\t",i,’a’);;
   b:prf("-%c\\t",i,’b’);;
   c:prf("-%c\\t",i,’c’);;
   d:prf("-%c\\t",i,’d’);;
   default:;
  }
 }
 prf("\\n");
}

  位运算

  前面介绍各种运算都是以字节作为最基本位进行但在很多系统中常要求在位(bit)级进行运算或处理C语言提供了位运算功能这使得C语言也能像汇编语言样用来编写系统

  、位运算符C语言提供了 6种位运算符:

  &按位和
  |按位或
  ^按位异或
  ~取反
  <<左移
  >>右移

  1.按位和运算按位和运算符"&"是双目运算符其功能是参和运算两数各对应 2进位相和只有对应两个 2进位均为1时结果位才为1否则为0参和运算数以补码方式出现

  例如:9&5可写算式如下:00001001(9 2进制补码)&00000101(5 2进制补码) 00000001(1 2进制补码)可见9&5=1

  按位和运算通常用来对某些位清0或保留某些位例如把a高 8位清0保留低 8位可作a&255运算(255 2进制数为0000000011111111)

{
 a=9,b=5,c;
 c=a&b;
 prf("a=%d\\nb=%d\\nc=%d\\n",a,b,c);
}

  2.按位或运算按位或运算符“|”是双目运算符其功能是参和运算两数各对应 2进位相或只要对应 2个 2进位有个为1时结果位就为1参和运算两个数均以补码出现

  例如:9|5可写算式如下:

00001001|00000101


00001101(十进制为13)可见9|5=13
{
 a=9,b=5,c;
 c=a|b;
 prf("a=%d\\nb=%d\\nc=%d\\n",a,b,c);
}

  3.按位异或运算按位异或运算符“^”是双目运算符其功能是参和运算两数各对应 2进位相异或当两对应 2进位相异时结果为1参和运算数仍以补码出现例如9^5可写成算式如下:

00001001^0000010100001100(十进制为12)
{
 a=9;
 a=a^15;
 prf("a=%d\\n",a);
}

  4.求反运算求反运算符~为单目运算符具有右结合性其功能是对参和运算各 2进位按位求反例如~9运算为:~(0000000000001001)结果为:1111111111110110

  5.左移运算左移运算符“<<”是双目运算符其功能把“<<”左边运算数各 2进位全部左移若干位由“<<”右边

数指定移动位数

  高位丢弃低位补0例如:a<<4指把a各 2进位向左移动4位如a=00000011(十进制3)左移4位后为00110000(十进制48)6.右移运算右移运算符“>>”是双目运算符其功能是把“>>”左边运算数各 2进位全部右移若干位“>>”右边数指定移动位数

  例如:设a=15a>>2 表示把000001111右移为00000011(十进制3)应该介绍说明对于有符号数在右移时符号位将随同移动当为正数时最高位补0而为负数时符号位为1最高位是补0或是补1取决于编译系统规定TurboC和很多系统规定为补1

{
 unsigneda,b;
 prf("inputanumber:");
 scanf("%d",&a);
 b=a>>5;
 b=b&15;
 prf("a=%d\\tb=%d\\n",a,b);
}

  请再看例!

{
 chara=’a’,b=’b’;
 p,c,d;
 p=a;
 p=(p<<8)|b;
 d=p&0xff;
 c=(p&0xff00)>>8;
 prf("a=%d\\nb=%d\\nc=%d\\nd=%d\\n",a,b,c,d);
}
Tags:  c语言枚举 c语言中的位运算 c语言位运算符 c语言位运算

延伸阅读

最新评论

发表评论