神奇的C语言二十一:谈谈位运算
2014-06-12 19:03
274 查看
写C程序时位运算还是很常用的,您肯定也很了解位运算的基本规则。下面是位运算的部分应用。
亦或^:
可以实现位取反,例如:
特性:两个相同的数的亦或结果是0。多个数亦或满足交换律。
有道ACM题就是利用了这一点:2*n+1个数,有2*n个数字俩俩相同,只有1个数和其他数都不同,请找出这个数。
利用此特性还可以在不使用辅助变量的情况下交换两个变量的值(不过最好别这么做)。
此特性还可以用于将变量清零,不过这多用于汇编中。
或|:
可以实现将某位置1的操作,例如:
与&:
可以实现将某位清0,例如:
测试某位是否为1:,例如:
左移<<:
低位向高位进行移位,高位被移出的位被丢弃,低位移入0。
右移>>:
高位向低位进行移位,高位移入原来的符号位,低位移出的位被丢弃。
位移运算常常被用来做快速的乘2和除2运算,不过要注意的是,他们之间并没有逆运算的关系。除2运算的结果是四舍五入的整数,所以最好只对2的次方数进行右移除2运算。
亦或^:
可以实现位取反,例如:
char a = 0x0F; a ^= 0xFF; // 现在,a变成了0xF0
特性:两个相同的数的亦或结果是0。多个数亦或满足交换律。
有道ACM题就是利用了这一点:2*n+1个数,有2*n个数字俩俩相同,只有1个数和其他数都不同,请找出这个数。
利用此特性还可以在不使用辅助变量的情况下交换两个变量的值(不过最好别这么做)。
此特性还可以用于将变量清零,不过这多用于汇编中。
或|:
可以实现将某位置1的操作,例如:
char a = 0xF2; char mask = 0x04; // 将第三位置1 a |= mask; // a现在是0xF6
与&:
可以实现将某位清0,例如:
char a = 0xF2; char mask = 0xFD; a &= mask; // 现在a是0xF0
测试某位是否为1:,例如:
char a = 0xFF; char mask = 0x01; if (a & mask != 0) // 则第一位为1
左移<<:
低位向高位进行移位,高位被移出的位被丢弃,低位移入0。
右移>>:
高位向低位进行移位,高位移入原来的符号位,低位移出的位被丢弃。
位移运算常常被用来做快速的乘2和除2运算,不过要注意的是,他们之间并没有逆运算的关系。除2运算的结果是四舍五入的整数,所以最好只对2的次方数进行右移除2运算。
相关文章推荐
- 神奇的C语言二十:谈谈类型转换
- 基于proteus的51单片机仿真实例二十一、C语言的自增和自减运算演示实例
- C语言中位运算的一点小小总结
- C语言里的左移和右移运算
- C语言的位运算的优势
- 黑马程序员——C语言之机器数真值、原反补码、位运算与变量地址获取及输出原理
- C语言的运算优先
- c语言指针初探 一指针运算与多级指针
- 【C语言】07-基本语句和运算
- 黑马-C语言-关系,逻辑运算
- 谈谈C语言教学:应该从一开始就培养学生良好的编程风格和习惯
- C语言数据结构----栈的应用(四则运算)
- 谈谈C语言的溢出
- 位运算02 - 零基础入门学习C语言65(完)
- C语言中指针初始化和常规运算
- 数据结构C语言实现稀疏矩阵的压缩和运算的三元组顺序表表示法
- C语言中的运算符号优先级和运算顺序
- 谈谈协程和C语言的协程
- [C语言] 指针的算术运算
- 运算字符串解析(c语言)