写C程序时位运算还是很常用的,您肯定也很了解位运算的基本规则。下面是位运算的部分应用。
亦或^:
可以实现位取反,例如:
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运算。