c位运算c语言程序设计教程.ppt
文本预览下载声明
第十二章 位运算 § 12.1 位运算概述 ? C 语言除了具有高级语言地功能以外,其一重要 特点是具有某些低级语言的功能。 ? C 语言有系统调用的功能,调用系统功能函数,调用读 写 I/O 端口函数等。 ? C 语言具有直接对 C 中的 int 和 char 类型的数据的某些字 节或位进行操作的能力。 ? 用于位操作的运算符 ? 基本位运算符: 按位与, | 按位或, ^ 按位异或 ~ 按位取反, 右移, 左移 ? 与赋值运算符相结合的位运算符: = 位与赋值, | = 位或赋值, ^= 位异或赋值 = 右移赋值, = 左移赋值 ? 按位异或运算符 ? ^ 是一个双目运算符 ? 作用:判断两个相应位的值是否“相异”,若不 同,则结果为 1 ,若相同,则结果为 0 。 ? 用途:可用于“翻转”某位的值,也就是使 0 翻转 成 1 ,使 1 翻转成 0 main() { unsigned char a,b; printf(“enter two hex numbers:”); scanf(“%x,%x”,a,b); printf(“a^b=%x \ n”,a^b); } 结果: enter two hex number:10,35 ? a^b=25 例: a^b a= 0 0 0 1 0 0 0 0 ( 十六进制数 10) ( ^ ) b= 0 0 1 1 0 1 0 1 ( 十六进制数 35) a ^ b= 0 0 1 0 0 1 0 0 ( 十六进制数 25) 此位翻转 ? 按位取反运算符 ? ~ 是一个单目运算符 ? 作用:使一个数据中所有位都取其反值,即 0 变 1 , 1 变 0 。 例: ~a a= 0 0 0 0 0 0 1 1 ( 十六进制数 03) ~a= 1 1 1 1 1 1 0 0 ( 十六进制数 fc) main() { unsigned char x; printf(“enter a hex numbers:”); scanf(“%x”,x); printf(“%x \ n”,~a); } 结果: enter a hex number:03 ? fc ? 左移运算符 ? 是一个双目运算符 ? 作用:将一个数中各个位全部左移若干位,移出 的部分舍弃,右边空出来的位置补零。 例: a2 a= 1 0 0 0 0 1 0 1 ( 十六进制数 85) a2= 1 0 0 0 0 1 0 1 0 0 ( 十六进制数 14) 舍弃 补零 main() { unsigned char x,b; printf(“enter a hex numbers:”); scanf(“%x”,x); b=x2; printf(“%x \ n”,b); } 结果: enter a hex number:85 ? 14 ? 右移运算符 ? 是一个双目运算符 ? 作用:将一个数中各个位全部右移若干位,右移出 的位丢弃,左端的补充要区分两种情况。 (1) 无符号数,右移时左端补零 例: a2 a 为无符号数 a= 1 0 0 0 0 1 0 1 ( 十六进制数 85) a2= 0 0 0 0 0 1 0 1 0 1 ( 十六进制数 21) 补零 丢弃 (2) 有符号数,如果符号位为 0( 即正数 ) ,则左边补入 0 ,如果符号位为 1( 即负数 ) ,则左边补入的全是 1 。 例: a2 , a 为正数 a= 0 0 0 0 0 1 0 1 ( 十六进制数 5) a2= 0 0 0 0 0 0 0 1 0 1 ( 十六进制数 1) 补零 丢弃 例: a2 a 为负数 a= 1 1 0 0 0 1 0 0 ( 十进制数 -60) a2= 1 1 1 1 0 0 0 1 0 0 ( 十进制数 -15) 补 1 丢弃 § 12.3 位段 ? 位段是一种特殊形式的结构体结构中的成员。 ? 它以位为单位来定义结构体中的成员的长度。 ? 位段定义 struct packed_datal { unsigned int a :3; /* 占 3 位 */ unsigned int b : 1 ; /* 占 1 位 */ unsigned int c
显示全部