- 1、本文档共21页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C21第2章 位运算
位运算 位运算是指按二进制位进行的运算,实际上就是直接对整数在内存中的二进制位进行操作。 考虑这样的问题:编程控制编号为0至7的八盏灯的开关。 可以定义一个长度为8的短整型数组变量a。 可以定义一个无符号的字符型变量c。 如果c的值为128(1000 0000),则7号灯亮,其余灯灭;为192时(1100 0000),则6号和7号灯亮,其余的灭。 但是要改变某盏灯的状态而不影响其他灯的,却并非易事。 位操作符 C语言提供的位操作符有按位与、按位或|、按位异或^、取反~、左移和右移。 位操作符的操作数仅限整型(字符型), 为简明下面示例中位操作符的操作数多为字符型。 12.1.1 按位与操作符 按位与操作符将参与运算的两个操作数,按二位进制位进行“与”运算。与运算时,如果两个二进制位上的数均为1 ,则运算结果的相应位为1,否则运算结果的相应位为0。即 1 1 = 1、1 0 = 0、0 1 = 0、0 0 = 0 例如:char a = -2, b = 3,则a b的值为2。 按位与操作符 从按位与操作符的运算规则可知,利用按位与操作符可以很容易地在不影响其它位的情况下将一个整数的某位设置为0。 例如,无符号字符型c的值为165(1010 0101),即现在是第0、2、5、7号灯亮。需熄灭第七号灯时, 只要让c与0x7f(0111 1111)进行按位与运算即可。 注意: 1. 按位与操作符也可以构成复合赋值操作符,即c = c 0x7f可改写为c = 0x7f。 2. 利用按位与操作符对整型变量a的各位进行取舍时,如果保留某位的值,则另一操作数的对应位值为1;如果清零,则对应位的值为0。 1 1 = 1、1 0 = 0、0 1 = 0、0 0 = 0 12.1.2 按位或操作符| 按位或操作符|将参与运算的两个操作数,按二进制位进行“或”运算。或运算时,如果两个二进制位上的数都为0,则运算结果的对应位为0;否则,对应位为1。即 1 | 1 = 1、1 | 0 = 1、0 | 1 = 1、0 | 0 = 0。 由运算规则可知,利用按位或操作符|可以很容易地在不影响其它位的情况下将一个整数的某位设置为1。 例如,无符号字符型c的值为165,需点亮1号灯时,只要让c与0x2作按位或运算即可。c |= 0x2 12.1.3 异或操作符^ 异或操作符^也称xor操作符。“异或”指参与运算的两个二进制位是否为异(不同),不同时结果为1(真),相同时结果为0(假)。即 1 ^ 1 = 0、1 ^ 0 = 1、0 ^ 1 = 1、0 ^ 0 = 0。 分析运算规则可知,某位与1进行异或运算时,结果与该位正好相反(翻转),即1变0,0变1;某位与0进行异或时,结果与该位相同。 例如,无符号字符型c的值为165,需把第0到3号灯的状态进行翻转时即亮的灭,灭的亮,只要让c与0xf作异或操作即可。c ^= 0xf 12.1.4 取反操作符~ 取反操作符是一个单目操作符,用来对一个整数按二进制位取反,即0变1,1变0。 例如,无符号字符型c的值为165,需把所有灯的状态进行翻转时,只要让进行取反操作即可。c = ~c。 整数a的相反数可以表示为~a + 1。 因为~a等价于-1-a,故~a+1的值为-1-a+1为-a。 12.1.5 左移操作符 左移操作符常用形式为:a n 其中,a和n均为整数,表达式求值时将a的二进制位全部左移n位,右端补n个0,左端移出的n位因溢出而舍弃。显然n的取值范围通常为1至sizeof(a)。 左移1位的值为a的2倍,左移2位的值为a的4倍,……(表达式的值不能超出整型的取值范围)。左移操作要比相应的乘法运算(a*2)快得多。 在位运算中,左移运算常用于构造操作数。 构造操作数 无符号字符型变量c的值为165,需点亮第6号灯,可以用如下表达式 c |= 1 6,其中,1 6即0100 0000。 注意: 左移操作也可看作算术运算,故其优先级低于算术操作符但高于关系运算符。 单目操作符~的优先级较高。按位与、按位或和按位异或的优先级低于关系操作符,但高于逻辑操作符。 12.1.6 右移操作符 右移操作符与左移操作符类似,表达式a n求值时,会将a的二进制位全部右移n位,右端移出的n位因溢出而被舍弃。 根据左端移入数的不同,右移操作分为“逻辑右移”和“算术右移”两种。 逻辑右移时,无论a为何类型,左端均移入n个0;算术右移时,如果a为无符号数,则左端移入n个0;如果a为有符号数,则左端移入的数为a的符号位,即a为正数时移入0,a为负数时移入1。TC和VC6.0中均采用算术右移。 例12-1 分析下面求整数绝对值的函数 分析: 如果x=0,则y的值为0,(x ^ y) - y 的结果仍
文档评论(0)