异或在C/C++编程中的应用
来源:互联网 发布:俄罗斯聊天软件 vk 编辑:程序博客网 时间:2024/05/19 13:08
本文主要介绍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的加解密算法中,也会用到异或的这个特性。
0 0
- 异或符号'^'在C/C++编程中的应用
- 异或在C/C++编程中的应用
- enum在编程中的应用(c、c++)
- 有限状态机在C语言编程中的各种应用
- 关于select 函数在 Linux C Socket编程中的应用
- 有限状态机在C语言编程中的各种应用
- 译:应用笔记 在C中的简单面向对象编程
- 有限状态机在C语言编程中的各种应用
- 异或运算在算法编程题中的应用
- 有关异或符号'^'在c++编程中的应用
- SQlite在c#中的应用
- C语言中的|、||、&、&&、异或、~、!
- Java在C/S网络中的应用
- 二分法在C#.net 中的应用
- 结构在C程序中的应用
- 数据结构在C语言中的应用
- static在C语言中的应用
- CONST在C语言中的应用
- Python中的List
- Saving Android View state correctly
- 第十六周:C语言:计算该日在本年中是第几天
- 第15周OJ-12
- Java中调用matlab遇到的问题总结
- 异或在C/C++编程中的应用
- C++读取硬盘序列号
- 字符串替换
- 【Java每日一题】20161222
- 复习--递归求二进制数
- [李景山php]每天TP5-20170121|thinkphp5-Process.php-3
- ESP8266学习之搭建Linux开发环境
- 三色球
- Linux_8th_第1个linux驱动___自动分配主设备号