- 3
- 0
- 约1.24万字
- 约 79页
- 2018-04-29 发布于河南
- 举报
算及程序调试
第12章 位 运 算及程序调试 一、位运算 位运算和位运算符 位运算举例 位运算 按二进制位进行运算 位运算的运算对象是二进制的位 位运算速度快,效率高,节省存储空间 只能对整型数据(包括字符型)进行位运算 负数以补码形式参与运算 注意与逻辑运算区别 位运算符 (Bitwise Operators) 按位与 (Bitwise AND) 运算规则 0 0 = 0; 0 1 = 0; 1 0 = 0; 1 1 = 1; 用法 按位清零 保留某些指定位 按位与举例 运算举例 1010,1101 (0xAD) 0110,1001 (0x69) 0010,1001 (0x29) 按位清零、保留 xxxx,xxxx_____ 0110,0010 (0x62) 0xx0,00x0_____ 按位或 (Bitwise Inclusive OR) 运算规则 0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1; 用法 按位置一 按位或举例 运算举例 1010,1101 (0xAD) | 0110,1001 (0x69) 1110,1101 (0xED) 按位置一 xxxx,xxxx_____ | 0110,0010 (0x62) x11x,xx1x_____ 按位异或 (Bitwise Exclusive OR, XOR) 运算规则 0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0; 说明 相“异”则为1,相“同”则为0 相当于按位且无进位的加法 按位异或用法举例 特定位翻转 1010,1101 (0xAD) ^ 0110,1001 (0x69) 1100,0100 (0xC4) 与0相异或,保持原值不变 与自身相异或,则全部位清零 交换两个整数值 a=a^b; b=b^a; a=a^b; 按位取反 (Ones Complement) 运算规则 ~ 0 = 1; ~ 1 = 0; 用法 所有位翻转 获得适用于不同系统的位运算模板 按位取反举例 运算举例 ~ 1010,1101 (0xAD) 0101,0010 (0x52) 位运算模板 对一个int类型的整数最后四位清零 16位整数: a 0xF0 32位整数: a 0xFFF0 可以使用: a ~(int)0xF 左移 (Left Shift) 运算规则 i n 把i各位全部向左移动n位 最左端的n位被移出丢弃 最右端的n位用0补齐 用法 若没有溢出,则左移n位相当于乘上2n 运算速度比真正的乘法和幂运算快得多 左移举例 运算举例 1010,1101 3 (101)0110,1000_____ 溢出举例 若左移后的数据超出表示范围,则发生溢出 int i, j; i = 0x2431; j = i2; /* j=-0x6F3C, 溢出 */ j = i3; /* j= 0x2188, 溢出 */ 右移 (Right Shift) 运算规则 i n 把i各位全部向右移动n位 最右端的n位被移出丢弃 最左端的n位用0补齐(逻辑右移) 或最左端的n位用符号位补齐(算术右移) 用法 右移n位相当于除以2n,并舍去小数部分 运算速度比真正的除法和幂运算快得多 右移举例 运算举例 0101,1101 3 0000,1011(101) 逻辑右移和算术右移 int i, j; i=-0x2431; j=i2; /* j=0x36F3, 逻辑右移 */ j=i2; /* j=0xF6F3, 算术右移 */ 不同长度数据位运算规则 两个操作数右端对齐 短的数据左端用符号位补齐 正数或无符号数左端用0补满 负数左端用1补满 两个操作数长度相等后再运算 位运算举例 将16进制短整数按二进制打印输出 输入:F1E2 输出:1111000111100010 输入:13A5 输出:0001001110100101 例1:将16进制数按二进制输出 二、程序调试 常见错误分析 程序调试 是不相同的。因此,建议最好不用会引起二义性的用法。如果在上例中,希望输出“3,4,5”时,可以改用 i=3; j=i+1; k=j+1; printf(%d,%d,%d\n,i,j,k); (27) 混淆数组名与指针变量的区别。 main( ) {int i,a[5]; for(i=0;i<5;i++) scanf(%d,a++); … } 企图通过a的改变使指针下移,每次指向欲输入数据的数组元素。它的错误在于不了解数组名代表数组首地址,它的值是不能改变的,用a++是错误的,应当用指针变量来指向各数组元素。即: int i,
原创力文档

文档评论(0)