神奇的C语言二十一:谈谈位运算

写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运算。
 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值