C语言之位运算(IO操作,变量交换)
基本运算符
&:按位与;
|:按位或;
^:按位异或;
~:取反;
<<:左移;
>>:右移;
应用1:IO位运算实现单个IO的操作
P2OUT |= BIT2;//将bit2赋值为1.不影响其他位
P2OUT &=~ BIT2;//将bit2赋值为0.不影响其他位
P2OUT ^= BIT2;//将bit2翻转(以前是0,就变为1;以前是1,就变为0).不影响其他位
应用2:交换两个变量的值
一般我们是怎么交换两个变量的值的?
常规姿势:
void Swap( unsigned int *i, unsigned int *j)
{
unsigned int t;
t=*i;
*i=*j;
*j=t;
}
什么,要用到第三个变量?太麻烦了,那这样?
尝试:
void Swap( unsigned int *i, unsigned int *j)
{
*i = *i + *j;
*j = *i - *j;
*i = *i - *j;
}
不妥不妥,两值相加的结果溢出unsigned int的变量范围怎么办
有没有一种方法既能避免变量的溢出,又可以不使用第三个变量呢?
当然是有的:
骚操作:
void Swap(unsigned int *a, unsigned int *b)
{
*a=*a^*b;
*b=*b^*a;
*a=*a^*b;
}
解析:
1.对于开始的两个赋值语句,a = a ^ b,b = b ^ a,相当于b = b ^ (a ^ b) = a ^ b ^ b,而b ^ b 显然等于0。因此b = a ^ 0,显然结果为a;
2. 同理可以分析第三个赋值语句,a = a ^ b = (a ^ b) ^ a = b;
注:
1.^ ,”异或“运算符。两个相应的位值为”异"(值不同)就取真(1);否则为假(0)。
2.^运算符的特点是与0异或,保持原值;与本身异或,结果为0;与0xFF异或,相当于取反~;
链接: 三人行,必有我师.