先来看一个case
马边彝族网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。成都创新互联公司2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联公司。
咱们今天闲话不用多说,先来看一个小例子。
问题当然很简单,交换两个数,常规的做法是引入一个中间变量,代码如下
func Swap(a, b int){
temp := a //把a的值赋值给临时变量temp,temp为a的值
a = b //把b的值赋值给a,现在a的值已经变成了b的值
b = temp // 再把之前temp中保存的a赋值给b即可
}
相信上面的代码大家应该都没问题,但是咱们来加大问题难度,如果不让引入第三个变量temp,能实现两个数字的交换么?
「建议大家先思考两分钟再往下看」。
其实很简单,代码如下:
func Swap(a, b int) {
a = a ^ b
b = a ^ b
a = a ^ b
}
相信您现在应该和我第一次看到这个代码的感觉一样,这特么是啥?????这样能把a和b的值交换?
先不要着急,咱们来一点一点的分析。
想要看懂上面的代码,首先你得知道什么叫异或运算。
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。(这特么是啥?)没明白没有关系,咱们接下来看例子:
比如a=5,b=3。
异或运算示意图
其实这个很好理解,任何数转换成二进制,每一位上的数字要么是0,要么是1,而和0进行异或,以前是0的位置和0相同,则结果为0,以前是1的位置和0不同,则结果为1,所以运算之后结果是没变的,如下图:
任何数和0进行异或运算
这个也很好理解,N^N每一位肯定都会是一样的,根据异或运算的法则,结果肯定每一位都为0。
任何数和自己进行异或运算
这个很好理解 也就是说 a^b^c运算 和c^b^a是一样的。
当你对异或运算有一定的了解了之后,咱们再来看一看开头的例子:
func Swap(a, b int) {
a = a ^ b
b = a ^ b
a = a ^ b
}
第一步运算:
a = a ^ b
第二步运算:
b = a ^ b
因为第一步a=a^b所以在第二步中直接把a替换成a^b即可
所以:
b = a ^ b ^ b
咱们在之前说过,「任何数字对自己进行异或运算的结果都为0」,所以b^b的结果就为0,上面也就等价于。
b= a^0
咱们在上面还说过,「任何数和0进行异或运算,都等于他自己」,所以:
b=a^0 = a
第三步运算:
a = a ^ b
此时b已经运算出来为a,a = a ^ b(第一步运算赋值) 所以第三步运算等价于。
a = a^b^a = 0^b = b(运算细节同第二步)
这样咱们就可以不用第三个变量进行两个变量的交换了。
标题名称:位运算的秒用--异或运算
网页地址:http://www.shufengxianlan.com/qtweb/news8/509508.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联