异或(^)运算的妙用
2009-10-27 11:00
369 查看
现有1,1,2,2,3,3,....,n,n共2n个数,其中各个数字排列的顺序是任意的,是杂乱放的,即没有排序。现在删除了其中的一个数剩下了2n-1个数,求删除的那个数?
可能大多数人的第一想法是:用2n个数的总和(n*
(n+1))减去2n-1个数的总和,不错,想法是正确的。但是,放在计算机中考虑的话,此方法就不太可行了,先不考虑算法效率的问题,主要是因为2n个
数的总和不知道具体有多大,所以可能存在溢出的问题。那有其他更好的办法吗?有!
下面是用异或(^)运算来解答这个题目的,不仅效率高而且不存在溢出的问题:
总结:
上面算法的思想是:当存在n个不连续的数的时候,且每个不同的数都成对出现(2,4,...个),那么同一类数字之间异或(相同为0,不同
为1)结果为0。比如:上题中存在两个数字3,二进制即11,那么,11^11等于00,也就是,十进制结果为0。所以,遍历2*n-1次后,剩下的那个数就是从2n个数中删除的那个数。
(转自:http://blog.csdn.net/delphiwcdj/archive/2009/10/26/4728465.aspx
)
可能大多数人的第一想法是:用2n个数的总和(n*
(n+1))减去2n-1个数的总和,不错,想法是正确的。但是,放在计算机中考虑的话,此方法就不太可行了,先不考虑算法效率的问题,主要是因为2n个
数的总和不知道具体有多大,所以可能存在溢出的问题。那有其他更好的办法吗?有!
下面是用异或(^)运算来解答这个题目的,不仅效率高而且不存在溢出的问题:
//假设剩余的数据全部存放在data数组中 unsigned int nDel=0; for(int i=0;i<2*n-1;++i) { nDel ^= data[i]; } cout<<"被删的数是"<<nDel<<endl;
总结:
上面算法的思想是:当存在n个不连续的数的时候,且每个不同的数都成对出现(2,4,...个),那么同一类数字之间异或(相同为0,不同
为1)结果为0。比如:上题中存在两个数字3,二进制即11,那么,11^11等于00,也就是,十进制结果为0。所以,遍历2*n-1次后,剩下的那个数就是从2n个数中删除的那个数。
(转自:http://blog.csdn.net/delphiwcdj/archive/2009/10/26/4728465.aspx
)
相关文章推荐
- 异或运算的妙用
- 异或(^)运算的妙用
- 关于位异或运算的妙用
- 输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
- 输入一个32位的整数啊,使用按位异或运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
- 5.题目:输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果 提示:0 ^ 0 = 0; 1 ^ 1 = 0;
- 按位异或的妙用
- Java的位运算符 与(&)、非(~)、或(|)、异或(^) 的某些妙用。
- 异或的性质和运算
- C位运算中 异或运算符的 几点注意与示例
- 简易计算器(只有加减乘除和异或运算)
- 异或运算实现两个数的交换
- 按位与、或、异或等运算方法(转)
- 按位与、或、异或等运算方法
- linux命令逻辑运算:与、或、非、异或
- hdu 4768 异或运算
- 位运算的异或来交换变量
- 异或 ^ 运算
- 异或运算的一些知识
- 位运算中的异或运算