异或运算符估计很多朋友只在C语言初学运算符的章节背过一些性质,直至其理论不知其实际用法。今天就给大家分享一下c语言如何进行异或?
1不用第三变量交换两个数
A = A ^ B; B = A ^ B; A = A ^ B;
当看到这种办法以后,你会拿着两个数据来进行尝试,最后验证OK,以后估计也会不了了之,其实这中间蕴含着异或运算一个非常重要的性质。当一个数异或同一个数偶数次,最终还是得到原来的数。当B的个数为偶数,则A^B^B^B.... = A有了这个性质我们再推导一下两数交换:
将第(2)和第(3)分别展开便可以得到最终交换结果,妙呀~A = A ^ B; .............(1) B = A ^ B; .............(2) A = A ^ B; .............(3) (2) => B = (A ^ B) ^ B => B = A (3) => A = (A ^ B) ^ (A) => A = B
2固定位翻转
点灯大师当累了,可以玩玩LED的翻转,嵌入式中是经常需要这样使用的,从异或的性质来看它是天然的翻转神器:比如想对一个GPIO的数据寄存器中的1、2、5位进行翻转,你可以定时直接GPIO_DATA^0b100110便可以实现对应位的电平翻转。0 ^ 1 = 1 1 ^ 1 = 0
当然这里只是聊了一下翻转LED,思路还可以更加的开阔~
3不用条件语句实现整数绝对值
怎么说呢?这种编程一般用在面试题里面,实际项目中基本上就是一个abs搞定了,这里主要是借助这个实例来讲讲异或的两个小技巧。A ^ 0xFF.. = ~A A ^ 0 = A
正数的绝对值为原值,而负数的绝对值为取反+1.
那么当看到上面两个性质,以一个8位有符号数为例子,其最高位为符号位,正数为0,负数为1,那么把一个8位有符号数右移7位。
如果是正数最高位补0,最终数值为0;
如果是负数最高位补1,最终数字为0xFF,也就是-1。
以上就是“c语言如何进行异或?”的详细内容,想要了解更多C语言教程欢迎持续关注编程学习网
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/9901/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取