详解C异或运算

对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。

创新互联网站建设由有经验的网站设计师、开发人员和项目经理组成的专业建站团队,负责网站视觉设计、用户体验优化、交互设计和前端开发等方面的工作,以确保网站外观精美、网站建设、网站制作易于使用并且具有良好的响应性。

异或运算可以达到交换两数的目的,代码如下:

void swap(int &a, int &b)
{
   a = a^b;
   b = a^b;
   a = a^b;
}

但不推荐使用这种方式,附上常用的临时变量方法对比说明。

临时变量方法:

void swap(int &a, int &b)
{
   int tmp = a;
   a = b;
   b = tmp;
}

对于临时变量法,每次赋值只要读取一个变量的值到寄存器,然后再从寄存器写回到另一个变量中即可,前后涉及两次内存写入操作;但是对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。另外一点,异或操作的代码可读性差。

如果使用C语言实现上述两种方法,并用gcc编译器编译,可以使用命令 gcc -S swap.c 查看相应的汇编代码,临时变量法代码行数更少,另外使用 gcc 编译器时,用异或运算交换数组会出错,参见链接。

在不引入临时变量的基础上,交换两数的值还可以使用三次加减法,代码如下:

void swap(int &a, int &b)
{
   a = a + b;
   b = a - b;
   a = a - b;
}

这种方式同样需要三次内存写入操作,同时代码可读性也较差。

最后附上两张三种方法编译后对应汇编代码对比图(平台:Ubuntu14.04,gcc 4.8.4),图中 swap1.c 文件对应临时变量法,swap2.c 文件对应加减方法,swap3.c 文件对应异或方法。可以看到,临时变量法编译出的汇编代码量最少即效率更高,加减法和异或方法的区别仅仅是计算方式不同而已,操作步骤是一致的。

图1: 临时变量法和加减法汇编代码对比,点击图片查看大图。

图2: 异或方法和加减法汇编代码对比,点击图片查看大图。

当前文章:详解C异或运算
网站路径:http://www.hantingmc.com/qtweb/news45/270845.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联