




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、按位与按位或按位异或运算2009-08-17 16:19:42| 分类:计算机基础学习|标签:|字号大中小 订阅(其实就想查一下 按位与按位或按位异或运算”的意义,结果人家还附送了好多资料,我也就老实不客 气的照搬过来了)摘自:1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应 的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下:00001001 (9 的二进制补码)&00000101 (5 的二进制补码)00000001 (1 的二进制补码)可见9&a
2、mp;5=1 o按位与运算通常用来对某些位清0或保留某些位。例如把 a的高八位清 0 ,保留低八位,可作a&255运算(255 的二进制数为 0000000011111111)。应用:a. 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)b. 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)2. 按位或运算 按位或运算符“是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应 的二个二进位有一个为1时,结果位就为1 o参与运算的两个数均以补码岀现。例如:9|5可写算式如下:00001001|000001010000110
3、1 (十进制为13)可见9|5=13应用:常用来将源操作数某些位置1,其它位不变。(mask中特定位置1,其它位为0 s=s|mask)3. 按位异或运算 按位异或运算符“是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为 1。参与运算数仍以补码出现,例如9A5可写成算式如下:0000100190000101 00001100 (十进制为 12)应用:a. 使特定位的值取反(mask中特定位置1,其它位为0 s=sA mask)b. 不引入第三变量,交换两个变量的值(设 a=a1,b=b1)目 标 操 作 操作后状态a=a1Ab1 a=aAb a=a1Ab
4、1,b=b1b=a1Ab1Ab1 b=aAb a=a1Ab1,b=a1a=b1Aa1Aa1 a=aAb a=b1,b=a14. 求反运算求反运算符为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。例如 9的运算为: (0000000000001001) 结果为: 11111111111101105. 左移运算左移运算符 “<<”是双目运算符。其功能把 “<< 左”边的运算数的各二进位全部左移若干位,由 “<<”右边的数 指定移动的位数, 高位丢弃,低位补 0。 其值相当于乘 2。例如: a<<4 指把 a 的各二进位向左移动
5、4 位。如 a=00000011( 十进制 3),左移 4 位后为 00110000( 十进制 48)。6. 右移运算右移运算符 “>>”是双目运算符。其功能是把 “>> 左”边的运算数的各二进位全部右移若干位,“>>右”边的数指定移动的位数。其值相当于除 2。例如:设 a=15 , a>>2 表示把 000001111 右移为 00000011( 十进制 3)。对于左边移出的空位,如果是正数则空位补 0,若为负数,可能补 0 或补 1 ,这取决于所用的计算机系统。移入 0 的叫逻辑右移,移入 1 的叫算术右移, Turbo C 采用逻辑右移。m
6、ain()unsigned a,b;printf("input a number: ");scanf("%d",&a);b=a>>5;b=b&15;printf("a=%d b=%d ",a,b);再看一例 :main()char a='a',b='b'int p,c,d;p=a;p=(p<<8)|b;d=p&0xff;c=(p&0xff00)>>8;printf("a=%d b=%d c=%d d=%d ",a,b
7、,c,d);浮点数的存储格式:浮点数的存储格式是符号 +阶码 (定点整数 )+尾数(定点小数 )SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM即 1 位符号位 (0 为正, 1 为负), 8 位指数位, 23 位尾数位 浮点数存储前先转化成 2 的 k 次方形式,即:f = A1*2Ak + A2*2A(k-1) + . + Ak +. +An*2A(-m) (Ai = 0, 1, A1 = 1)女口 5.5=2人2 + 2A0 + 2A(-1)其中的k就是指数,加127后组成8位指数位5.5 的指数位就是 2+127 = 129 = 10000001A2A3An 就是尾数位
8、,不足 23 位后补 0所以 5.5 = 01000000101000000000000000000000 = 40A00000所以,对浮点数 *2 、/2 只要对 8 位符号位 +、- 即可,但不是左移、右移关于 unsigned int 和 int 的在位运算上的不同,下面有个 CU 上的例子描述的很清楚:问题 :这个函数有什么问题吗?* 本函数将两个 16 比特位的值连结成为一个 32 比特位的值。* 参数: sHighBits 高 16 位* sLowBits 低 16 位* 返回: 32 位值long CatenateBits16(short sHighBits, short sLo
9、wBits) long lResult = 0; /* 32 位值的临时变量 */ /* 将第一个 16 位值放入 32 位值的高 16 位 */ lResult = sHighBits;lResult <<= 16;/* 清除 32 位值的低 16 位 */lResult &= 0xFFFF0000;/* 将第二个 16 位值放入 32 位值的低 16 位 */ lResult |= (long)sLowBits;return lResult; /问题的发现 :我们先看如下测试代码:/int main()short sHighBits1 = 0x7fff;short sH
10、ighBits2 = 0x8f12;unsigned short usHighBits3 = 0xff12;short sLowBits1 = 0x7bcd;long lResult = 0;printf("sHighBits1 + sLowBits1 "lResult = CatenateBits16(sHighBits1, sLowBits1); printf("lResult = %08x ", lResult, lResult);lResult = CatenateBits16(sHighBits2, sLowBits1); printf(&qu
11、ot;lResult = %08x ", lResult, lResult);lResult = CatenateBits16(usHighBits3, sLowBits1); printf("lResult = %08x ", lResult, lResult);/运行结果为:sHighBits1 + sLowBits1lResult = 7fff7bcdlResult = 8f127bcdlResult = ff127bcd嗯,运行很正确嘛于是我们就放心的在自己的程序中使用起这个函数来了n 个小时的检查和调试,最后终于追踪可是忽然有一天,我们的一个程序无论如何
12、结果都不对!经过到CatenateBits16() !?它的返回值居然是错的!郁闷! ”你说, “这个函数怎么会有问题呢!? 可是,更郁闷的还在后头呢,因为你把程序中的输入量作为参数,在一个简单的 main() 里面单步调试:/int main()short sHighBits1 = 0x7FFF;short sHighBits2 = 0x8F12;unsigned short usHighBits3 = 0x8F12;short sLowBits1 = 0x7BCD; / 你实际使用的参数short sLowBits2 = 0x8BCD; / 你实际使用的参数long lResult = 0
13、;printf("sHighBits1 + sLowBits1 "lResult = CatenateBits16(sHighBits1, sLowBits1);printf("lResult = %08x ", lResult, lResult);lResult = CatenateBits16(sHighBits2, sLowBits1);printf("lResult = %08x ", lResult, lResult);lResult = CatenateBits16(usHighBits3, sLowBits1);prin
14、tf("lResult = %08x ", lResult, lResult);printf(" sHighBits1 + sLowBits2 "lResult = CatenateBits16(sHighBits1, sLowBits2);printf("lResult = %08x ", lResult, lResult);lResult = CatenateBits16(sHighBits2, sLowBits2);printf("lResult = %08x ", lResult, lResult);lRe
15、sult = CatenateBits16(usHighBits3, sLowBits2);printf("lResult = %08x ", lResult, lResult);return 0;/发现结果竟然是:sHighBits1 + sLowBits1 lResult = 7fff7bcd lResult = 8f127bcd lResult = 8f127bcdsHighBits1 + sLowBits2 lResult = ffff8bcd /oops! lResult = ffff8bcd /oops! lResult = ffff8bcd /oops!前一次
16、还好好的,后一次就ffff 了? X 档案?X 档案的真相 :注意那两个我们用来当作低16 位值的 sLowBits1 和 sLowBits2已知:使用 sLowBits1 = 0x7bcd使用 sLowBits2 = 0x8bcd时,函数返回正确的值; 时,函数中发生 X 档案那么, sLowBits1 与 sLowBits2 有什么区别? 注意了, sLowBits1 和 sLowBits2 都是 short 型(而不是 unsigned short ),所以在这里, sLowBits1 代表 一个正数值,而 sLowBits2 却代表了一个负数值(因为 8 即是二进制 1000 ,sLo
17、wBits2 最高位是 1)。再看 CatenateBits16() 函数:/long CatenateBits16(short sHighBits, short sLowBits) long lResult = 0; /* 32 位值的临时变量 */* 将第一个 16 位值放入 32 位值的高 16 位 */ lResult = sHighBits;lResult <<= 16;/* 清除 32 位值的低 16 位 */lResult &= 0xFFFF0000;/* 将第二个 16 位值放入 32 位值的低 16 位 */ lResult |= (long)sLowBi
18、ts; / 注意这一句!return lResult;/如果我们在函数中用printf("sLowBits = %04x ", sLowBits);打印传入的 sLowBits 值,会发现sLowBits = 0x7bcd 时,打印结果为sLowBits = 7bcd而 sLowBits = 0x8bcd 时,打印结果为sLowBits = ffff8bcd是的,即使用 %04x 也打印出 8 位十六进制。因此,我们看出来了:当 sLowBits = 0x8bcd 时,函数中 "lResult |= (long)sLowBits;" 这一句执行,会先将 sLowBits 转换为0xffff8bcd再与 lResult 做或运算。由于现在 lResult 的值为 0xXXXX0000 (其中 XXXX 是任何值),所以显然,无 论 sHighBits 是什么值,最后结果都会是0xffff8bcd而当 sLowBits = 0x7bcd 时,函数中 "lResult |= (long)sLowBits;" 这一句执行,会先将 sLowBits 转换为0x00007bcd再与 lResult 做或运算。这样做或运算出来的结果当然就是对的。也就是说 ,CatenateBits16(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年心理发展与教育技术考试试卷及答案
- 2025年国际贸易与经济学考研试卷及答案分析
- 2025年全国高中数学竞赛试卷及答案
- 2025年人力资源管理考试题及答案
- 海外城市综合体施工进度监理及技术支持合同
- 商标品牌授权运营及市场拓展协议
- 电子商务平台技术研发与业务模式创新协议
- 基因治疗项目临床试验研究员派遣合同
- 果园无人机植保租赁与智能植保解决方案协议
- 网红蛋糕店区域代理加盟连锁经营合同
- 大学学院学生出国(境)访学管理办法(试行)
- 三年级数学-《年月日》整理和复习课件
- 兼职教师任职承诺书
- 两器车间产能分析
- JIS C9335-1-2014 家用和类似用途电器.安全性.第1部分:通用要求
- TSG Z7002-2022 特种设备检测机构核准规则
- 上海市2020年中考化学试卷(word版含解析)
- 史上最全的数列通项公式的求法15种
- 配电室高低压运行记录表
- 番茄采摘机械手
- 报联商——有效沟通PPT课件
评论
0/150
提交评论