·62· C程序设计要点分析与愿解 第8章枚举、位操作 8.1枚举 1,枚举的定义和说明 枚举是一个有名字的某些整数型常量的集合。这些整数常量是该类型变量可取的所有合 法值。枚举定义应当列出该类型变量的可取值。 一个完整的枚举定义说明语句的一般格式 enum枚举名(枚举列表}变量列表: 枚举的定义和说明也可写成两句,即: enum枚举名(枚举列表}: enum枚举名变量列表: 例如: enum day(Sun,Mon,Tue,Wed,Thu,Fri,Sat}dl,d2; enum day d1,d2: 用上述枚举定义说明语句,表明枚举类型day的变量dl和d2只可能取Sun,Mom等七个 估 2.枚举类型的使用 使用枚举类型有两个好处,其一,使程序更清晰,既提高可读性,也减少书写的错误 其二,迫使编译程序对所定义的类型加以严格检查,防止某些错误发生。 例如:计算第二天为星期几 enum day(Sun,Mon,Tue,Wed,Thu,Fri,Sat): enum dayday_after(d) enum day d: return((enum day)(((int)d+1)7)); 1 8.2位操作运算符 利用位操作运算符可对一个数按二进制格式进行位操作。 1.按位“与”运算& b3=b1&b2 例如: char b1=25,b2-=77,化成二进制(或十六进制)表示为: b1=00011001(或0x1B) b2=01001101(或0x4D) b3=00001001(或0x09)即b3=9
·62· C 程序设计要点分析与题解 第 8 章 枚举、位操作 8.1 枚举 1.枚举的定义和说明 枚举是一个有名字的某些整数型常量的集合。这些整数常量是该类型变量可取的所有合 法值。枚举定义应当列出该类型变量的可取值。 一个完整的枚举定义说明语句的一般格式: enum 枚举名{枚举列表}变量列表; 枚举的定义和说明也可写成两句,即: enum 枚举名{枚举列表}; enum 枚举名 变量列表; 例如: enum day{Sun,Mon,Tue,Wed,Thu,Fri,Sat}d1,d2; enum day d1,d2; 用上述枚举定义说明语句,表明枚举类型 day 的变量 d1 和 d2 只可能取 Sun,Mon 等七个 值。 2.枚举类型的使用 使用枚举类型有两个好处,其一,使程序更清晰,既提高可读性,也减少书写的错误; 其二,迫使编译程序对所定义的类型加以严格检查,防止某些错误发生。 例如:计算第二天为星期几 enum day{Sun,Mon,Tue,Wed,Thu,Fri,Sat}; enum day day_after(d) enum day d; { return((enum day)(((int)d+1)%7)); } 8.2 位操作运算符 利用位操作运算符可对一个数按二进制格式进行位操作。 1.按位“与”运算& b3=b1&b2 例如: char b1=25,b2=77,化成二进制(或十六进制)表示为: b1=00011001(或 0x1B) b2=01001101(或 0x4D) b3=00001001(或 0x09) 即 b3=9
第7章枚举、位操作 ·63· &可用作“掩码”运算,即屏蔽掉某些位.例如,掩码为127,化成二进制表示为01111111, 屏5掉第7位。 2.按位“或”运算 b3=b1/b2 h1=00011001(或0x1B b2=01001101(或0x4Dj b3=01011101(或0x5D)即b3=93 3.按位“异或”运算 b3=-b1^b3 b3=01010100(0x54)即b3=84 很容易验证:b3=b1b2b2=b1。这个特性可用于某些数据处理。例如,一个文本的每个 字经过与一个关键字做异或处理,就被简单地加密了。要解密时,只需用同一个关键字再做 一次异或处理,使其恢复原样。又如,用下列异或处理程序。 swapl (a,b) int a,b: asa b. b=a"b; a=a'b: 代替下列程序: swap(a.b) int a,br int temp: temp=a: a=b: b=temp: 同样实现a和b交换,异或处理的速度更快
第 7 章 枚举、位操作 ·63· &可用作“掩码”运算,即屏蔽掉某些位。例如,掩码为 127,化成二进制表示为 01111111, 可屏蔽掉第 7 位。 2.按位“或”运算 | b3=b1|b2 b1=00011001(或 0x1B b2=01001101(或 0x4D) b3=01011101(或 0x5D) 即 b3=93 3.按位“异或”运算^ b3=b1^b3 b1=00011001(0x1B) b2=01001101(0x4D) b3=01010100(0x54) 即 b3=84 很容易验证:b3=b1^b2^b2=b1。这个特性可用于某些数据处理。例如,一个文本的每个 字经过与一个关键字做异或处理,就被简单地加密了。要解密时,只需用同一个关键字再做 一次异或处理,使其恢复原样。又如,用下列异或处理程序: swap1(a,b) int a,b; { a=a^b; b=a^b; a=a^b; } 代替下列程序: swap(a,b) int a,b; { int temp; temp=a; a=b; b=temp; } 同样实现 a 和 b 交换,异或处理的速度更快
·64· C程序设计要点分析与题解 4.按位取反运算符 2=1,2为W1 二进制按位取反 例如:unsigne int1=0122457,w2: 二进制表示 (8进制表示) w11010010100101111 (0122457) w20101101011010000 (0055320) 5.左移运算符<< 将二进表示的数值各位顺序左移,最高位丢失,最低位补0。 例如:w1=014712,左移1位,即w2=w1<<1。 二讲制表示 (8进制表示) w10001100111001010 (014712) 2011011010100 031624) 左移n位相当于乘2的n次方,但左移速度比乘法快 6.右移坛算符>> 将二讲制表示的数值各位顺序右移,最低位丢失,对无符号整数最高位补0。 例如:040273,右移2位,即w2= 122 进制表示 (8进制表示) W10100000010111011 (040273) w20001000000101110 (010056) 右移n位相当于除以2的n次方,但右移速度比除法快。 例如:用移位方法测试出机器的字长(即t含二进制位数) oldlength( 1nt1: usinged v=~0: /*变量v为全1*/ for(i=1:(v=v>>1)>0:i++) return(i):
·64· C 程序设计要点分析与题解 4.按位取反运算符~ w2=~w1,w2 为 w1 二进制按位取反。 例如:unsigned int w1=0122457,w2; 二进制表示 (8 进制表示) w1 1010010100101111 (0122457) w2 0101101011010000 (0055320) 5.左移运算符<< 将二进表示的数值各位顺序左移,最高位丢失,最低位补 0。 例如:w1=014712,左移 1 位,即 w2=w1<<1。 二进制表示 (8 进制表示) w1 0001100111001010 (014712) w2 0011001110010100 (031624) 左移 n 位相当于乘 2 的 n 次方,但左移速度比乘法快。 6.右移运算符>> 将二进制表示的数值各位顺序右移,最低位丢失,对无符号整数最高位补 0。 例如:w=040273,右移 2 位,即 w2=w1>>2。 二进制表示 (8 进制表示) w1 0100000010111011 (040273) w2 0001000000101110 (010056) 右移 n 位相当于除以 2 的 n 次方,但右移速度比除法快。 例如:用移位方法测试出机器的字长(即 int 含二进制位数) woldlength() { int i; usinged v=~0; /*变量 v 为全 1*/ for(i=1;(v=v>>1)>0;i++) ; return(i); }