c语言之位运算


位运算是针对二进制来操作的,位运算符有 &、|、~、^、<<、>>

&按位与 ,简单一句话 按位与运算就是把一个二进制数变0;因为 1 & 1 结果是 1 其他情况 1&0 、0 &1 、 0& 0 都是 0

| 按位或,简单一句话就是将二进制数变1 ;因为 0 | 0 结果是0 其他情况 1 | 1、1|0、0|1 都是1

~按位取反更简单,~1 结果是 0 ;~0 结果是 1;

^按位异或的结果是 相同是 1 相异是0 ;1^1、0^0结果是 1;0^1、1^0结果是0

<<左移,后面跟左移多少位;左移的结果是高位舍弃,低位补0

>>右移,后面跟右移跟多少位,右移的结果是低位舍弃,高位根据符号位补,正数补0,负数补1


来解释下面这个例子:

int mNumA = 34;
int mNumB = 31;
mNumA = mNumA^mNumB;
mNumB = mNumB^mNumA;
mNumA = mNumA^mNumB;
printf("%d %d\n", mNumA, mNumB);

不产生第三个变量交换两个数,我们知道了对于计算机来说一切皆是010101无穷无尽的二进制;那么这二进制就可以做很多事。利用异或的特性,假如:

101001

111000

结果是 101110 这是第一次异或的结果;再拿 101110与111000异或的结果是 101001 就还原了

为啥会这样? 因为异或就是 1异或1两次还是1 0异或两次还是0中间变了一次1 这利用了二进制位运算一一对应的关系,可以进行异或加密等


下面这例子是判断奇偶数的好方法:

srand((unsigned)time(0));
int nNumD = rand();
if (nNumD&1==1)
{
printf("这是一个奇数%d\n", nNumD);


}
else{
printf("这是一个偶数%d\n", nNumD);
}

因为计算机cpu只认识010101,所以如果用%2来判断也可以实现,但是直接用二进制数进行操作,cpu就可以少跑很多次,编程和高级的应用技巧就在这里。

骚年们不管是不断积累经验,还是真正理解计算机的本质,结合编程语言的特性,打开脑洞进行一些应用,而不是简单从正常的逻辑思维解决问题。学习一点是一点!


int nNumX = 10001;
int nNumY = 9211;
int nNumZ = (nNumX + nNumY) >> 1;
printf("%d\n", nNumZ);

上面这个例子是求两个数的平均数,平均数的关键在/2;而二进制是啥?是满2进1啊,也就是无论是个数是什么数,右移一位就是/2 这是逆向思维,

其实这个十进制的计算一样一样的,只不过我们不习惯二进制而已。那么可以推出正整数<<是*2;>>1是/2;也可以推出左移多少位就是*2的n次方;而右移多少位就是/2的n次方



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值