博客
关于我
异或在C/C++编程中的应用
阅读量:126 次
发布时间:2019-02-26

本文共 1152 字,大约阅读时间需要 3 分钟。

    本文主要介绍C/C++编程中两个巧用异或解决问题的方法。

一、巧用异或进行取反运算

    假设安排一个周健身计划表,每天的可选项目包括:running,riding,swimming。现用一个enum表示周一到周日,如下:

enum Day{    Monday    = 0x1,    Tuesday   = 0x2,    Wednesday = 0x4,    Thursday  = 0x8,    Friday    = 0x10,    Saturday  = 0x20,    Sunday    = 0x40};
    上述enum用二进制上的一位,表示这一天是否有安排。不同位可以叠加,能够非常方便的表示不同天的状态,还可以参与计算。比如,前个项目的安排如下:

long runningSchedule = 0x25;long ridingSchedule  = 0x12;

    第一个值表示它占用了周一、周三和周四;第二个值表示它占用了周二和周五。这样表示,具有互斥性。他们的和为:

long ScheduleDays = 0x37;

    我现在要看有哪些天是空闲的,或者我要取消“runningSchedule”。我们需要对
“runningSchedule”取反,C++的按位取反运算符是“~”,但是,在实际的编码中,我对该long型的值,执行取反运算“~runningSchedule”,并未取得我想要的值,我使用的VS2015 IDE,VC++编译器。

    那么,有没有别的办法来代替直接的取反运算呢?

    答案是,有!那就是用异或。

ScheduleDays &= runningSchedule ^ 0xffff;
    见上述表达式,即可取消
“runningSchedule”。它最主要的原理是用异或,实现取反的功能。

二、异或交互两个变量的值

    在C语言面试中,经常会碰到这样一道题:不定义临时变量,交互两个数的值。一般的解法如下:

void exchange(int * a, int * b){    *a = *a + *b;    *b = *a - *b;    *a = *a - *b;}
    这种解法主要是通过加减和赋值运算来实现。它的缺陷有两个:

1)未考虑极限情况下的加法溢出问题;

2)仅适用于交互可以进行加减运算的变量的值;

    而使用异或不但可以弥补这两个缺陷,而且运算速度更快,如下:

void exchange(int * a, int * b){    *a = *a ^ *b;    *b = *a ^ *b;    *a = *a ^ *b;}
    注:这里应用了一个简单的异或法则:一个数异或另一个数两次,值不变。

    事实上,在AES的加解密算法中,也会用到异或的这个特性。

转载地址:http://ujqu.baihongyu.com/

你可能感兴趣的文章
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>
Nginx在开发中常用的基础命令
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx如何实现图片防盗链
查看>>
Nginx学习总结(11)——提高Nginx服务器的安全性,稳定性和性能的12种技巧
查看>>
Nginx学习总结(12)——Nginx各项配置总结
查看>>
Nginx学习总结(13)——Nginx 重要知识点回顾
查看>>
Nginx学习总结(14)——Nginx配置参数详细说明与整理
查看>>
Nginx学习总结(15)—— 提升 Web 应用性能的十个步骤
查看>>
Nginx学习总结(8)——Nginx服务器详解
查看>>
nginx学习笔记002---Nginx代理配置_案例1_实现了对前端代码的方向代理_并且配置了后端api接口的访问地址
查看>>
nginx学习笔记003---Nginx代理配置_注意,在Windows中路径要用/
查看>>
Nginx学习笔记(一) Nginx架构
查看>>
Nginx安装SSL模块 nginx: the “ssl” parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx
查看>>
nginx安装stream模块配置tcp/udp端口转发
查看>>
nginx安装Stream模块配置tcp/udp端口转发
查看>>
Nginx安装与常见命令
查看>>
nginx安装与配置
查看>>
【Flink】Flink 2023 Flink 到 Doris 实时写入实践
查看>>
Nginx安装及配置详解
查看>>