C语言之位运算(IO操作,变量交换)

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异或,相当于取反~;

链接: 三人行,必有我师.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值