- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
位运算及其应用实例
位运算及其应用实例(1)摘要位运算是C/C++中的基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生的运算——大多数程序员很少使用位运算。本篇先简要介绍基本的位运算操作符及其用法(何时使用),然后介绍位运算符的几个典型应用:(1)三种不用临时变量交换两个整数的实例,并分析每个实例的优缺点(2)进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用的,用于将十进制按照2的n次方进制输出的程序。(3)给出利用位运算实现的计算整数的二进制表示中有多少个1的实例。揭开位运算的面纱所 有数据在计算机底层都是按二进制存储的,一个数据可以看做是一个有序的位集合。每一位只有两种状态:0或1。位运算允许程序员操作数据的某一特定位,比如 将某位设置为1(或0),查询某位的状态(1,或0)。位运算由位运算操作符和操作数组成,不同的位运算操作符定义了不同的位运算,下面的表格是对每种位 运算操作符及其对应的位运算和功能进行描述:位运算操作符对应的位运算用法功能描述~按位非~expr翻转expr的每一个位:1变0,0变1?左移exprn将expr向左移动n位,移到外面的被丢弃,右边的位补0,因此左移n位相当于乘以2n?右移exprn将expr向右移n位,移到外面的被丢弃,如果expr是无符号类型,则左边补0,否则,左边插入符号位的拷贝或者0(视具体实现而定)。按位与expr1expr2在每个位所在处,如果expr1和expr2都含有1,那么结果该位为1,否则为0。|按位或Expr1 | expr2在每个位所在处,如果expr1和expr2都含有0,那么结果该位为0,否则为1。^按位异或Expr1 ^ expr2在每个位所在处,如果expr1和expr2不相同,那么结果该位为1,否则为0.除了上面的基本位运算操作符外,还有=,^=,|=,=,=等组合符号,它们分别是:按位与赋值,按位异或赋值,按位或赋值,左移赋值,右移赋值。接下来介绍如何实现位操作:1.将expr的第n(n从0开始)位设置为1:??????? expr |= (1n);2.将expr的第n(n从0开始)位设置为0:??? expr = (~(1n));3.判断expr的第n(n从0开始)位是否为1:bool b =expr (1n);4.翻转expr的第n(n从0开始)位:expr ^=(1n);注意1.C标准提供了bitset来进行各种位操作,可以在MSDN中输入bitset了解相关内容,使用时需要包含头文件:#include”bitset”。2.位运算只能用于操作有整数类型的数,比如说char,short,int,long等(包含signed 和unsigned),不能操作浮点数,比如float,double!std::bitset的构造函数的参数是unsigned long int,尽量不要对负数进行为操作,因为可移植性差,不同的系统平台对负数的右移操作定义不一样(大多数平台规定高位补符号位,有些平台规定高位补0)。位运算应用实例1:不用任何中间变量,交换两个整数这个问题是比较经典的了,你可以很容易地在网上找到多种答案,我在这里给出两个方案:方案1:用算术运算实现(一个不完美的方案)该方案的思路简单,实现代码很短,如下:view plainprint?Templateclass?T??Void?mySwap_1(T?a,?T?b)??{???????????a?=?a+b;???????????b?=?a?-b;???????????a?=?a-b;??}??简单吧,但是我还要简单说一下:第一句a=a+b;是用a保存原来的a跟原的b的和;第二句b = a-b;使得原来的a的值被保存到了b里面;最后一句a=a-b;使得原来的b的值保存到了a里面。我 们说这个方法是不那么完美的,原因在于算术运算可能会出现结果溢出的问题,假如a,b都非常大,那么第一句a=a+b就会导致结果溢出,比如说原来的a = 2147483647,b = 2,那么a+b就为2147483649,这个数大于了最大的无符号整数2147483648,因此发生溢出,a中保存的结果实际上 是:-2147483647,但是让人惊讶的是:虽然第一句程序得到的结果为-2147483647,后面两句得到的结果却是正确的,即能实现交换原始a,b的值,也就是说:只有第一句的结果是错误的,但最后的结果却是正确的,这一点让我很迷惑,至今还没弄清楚缘由,再次向各位求教!最后,谈谈这种方法相对于后面的方案2的优点:该方法可以用于交换两个非整数(浮点数),而方案2基于位运算,而对浮点数不能直接使用位运算,因此方案2不能用于交换两个浮点数!方案2:用位运算实现(较好的方案)???????? 该方案代码与方案1及其相似,思
文档评论(0)