使用异或交换数据值的原理

大家都知道,假如有a,b两个整型数,我们可以用

a^=b;

b^=a;

a^=b;

来交换a,b的值,在这里我说说其中的原理:

^ 在 C 里面是按位异或操作符,相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:

a = 0101   (5 的二进制表示)

b = 1100   (12 的二进制表示)

----

c = 1001   (结果为 9)

可以看出 c 中是 1 的部分就是 a 和 b 二进制表示对应位不同的部分,0 则是相同的部分。

牢记以下两条原则:

任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)

任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)

因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:

a = 0101

c = 1001

----

b = 1100

同样, b 与 c 异或结果就变成了 a:

b = 1100

c = 1001

----

a = 0101

时间: 2024-10-12 06:36:55

使用异或交换数据值的原理的相关文章

Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle

Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq  index2 3. 检查约束 (Check Counstraint) 对该列数据的范围.格式的限制(如:年龄.性别等)2 4. 默认约束 (Default Counstraint) 该数据的默认值2 5. trigger2 6. 外键机制  参照完整性:2 7. 断言约束:不必与特定的列绑定,可以理解为能应用于多个表的

异或交换两个数;实现pow(int x, int y) ,即x的y次方

问题1:异或交换两个数 假设x=2:y=3,我们的目标是(没有蛀牙!!)交换x,y的值: 利用异或的特殊性:x^x=0 即两个相同数字异或后值为0: 解决: 令x=x^y=2^3 令y=x^y=x^y^y=2^3^3=2(此时x=x^y) 令x=x^y=x^y^2=2^3^2=3(此时x=x^y:y=2) 问题2:实现pow(int x, int y) ,即x的y次方 x的y次方就是有y个x连续乘机,代码如下: #include <stdio.h> #include <stdlib.h&

客户端通过HTTP协议与服务端交换数据

客户端(包括浏览器)通过HTTP协议与服务端交换数据的描述 发起请求 http method 写请求使用POST 读请求使用GET 参数提交 提交一个普通对象,使用键值对参数 x-www-form-urlencoed 当同名参数有多个值时,使用http表单数组的方式 options[]:a options[]:b options[]:c - 当参数对应的值是复杂对象或多维数组时,json序列化该对象/多维数组 处理服务端响应 预先准备 根据业务需求,确定当前响应返回的是业务数据,还是系统消息.(

异或交换数值的分析

异或(^) 跟 按位与(&).按位或(|) 一样是一个位运算符,运算速度自然是很快的. 一般的,它似乎没什么用途.我所知道的它最多就用来加加密,用来交换数值.这里说说使用异或交换数值的一些利弊. 优点: 不需要使用中间变量 一般的交换a,b的值,是使用第三方变量temp temp = a; a = b; b = temp; 可是有一天突然发现了有异或交换数值的方法,这个方法不需要使用第三方变量 a = a ^ b; b = a ^ b; a = a ^ b;  这个方法的写法也很简单:复制3行a

用C语言实现:交换两值的内容。

可能很多人都认为这道编程问题非常的简单,只需要设置一个中间变量,再通过赋值即可完成交换两值的内容. 那我们今天就进一步深究一下这道简单的问题: 最基础的代码如下: #include<stdio.h> int main() { int a = 1, b = 2, t; printf("a=%d,b=%d\n", a, b); t = a; a = b; b = t; printf("a=%d,b=%d\n", a, b); system("pau

HTML5 postMessage 跨域交换数据

前言 之前简单讲解了利用script标签(jsonp)以及iframe标签(window.name.location.hash)来跨域交换数据,今天我们来学习一下HTML5的api,利用postMessage来跨域交换数据.和前面一些方式交换数据方式不同的是,利用postMessage不能和服务端交换数据,只能在两个窗口(iframe)之间交换数据,废话不多说,我们直接进入实战. 实战postMessage overview 上文中说,postMessage是用于两个窗口(iframe)之间交换

Vue 数据响应式原理

Vue 数据响应式原理 Vue.js 的核心包括一套"响应式系统"."响应式",是指当数据改变后,Vue 会通知到使用该数据的代码.例如,视图渲染中使用了数据,数据改变后,视图也会自动更新. 举个简单的例子,对于模板: {{ name }} 创建一个 Vue 组件: var vm = new Vue({ el: '#root', data: { name: 'luobo' } }) 代码执行后,页面上对应位置会显示:luobo. 如果想改变显示的名字,只需要执行:

继承类中static数据值

1 class A{ 2 static int num = 1; 3 public static void Display(){ 4 System.out.println( num ); 5 } 6 } 7 8 class B extends A{ 9 static int num = 2; 10 public static void Display(){ 11 System.out.println( num ); 12 } 13 } 14 15 class C extends A{ 16 st

Java并发工具类(四):线程间交换数据的Exchanger

简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方. Exchanger的应用场景 1.Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时