“异或”运算是C语言中一种比较冷僻的运算,除了一些特定领域的问题(如加密、图像处理等),较少有恰当的应用场合。以至于大多数C语言书在讲到异或这个运算时,一般都干巴巴的很生硬。
日前,看到 人人校招笔试题 中的对某问题的求解,发现异或在某些特定场合有非常奇妙的、恰如其分的甚至可说是舍我其谁的应用。
人人校招笔试题 中的问题是这样的:
给定一个有序数组a,长度为len,和一个数x,判断A数组里面是否存在两个数,他们的和为x,bool judge(int *a, int len, int x),存在返回true,不存在则返回false。
这个问题并不太难,除了博主给出了代码,另有网友给出了另外两种代码。
代码1
#include <stdio.h> #include <stdlib.h> #include <string.h> int Judge(int *a, int len, int x) { int Ascending = 0;//为1表示升序,否则降序 Ascending = a[1] > a[0] ? 1 : 0; int *CopyA = (int *)malloc(sizeof(int) * len); memset(CopyA, 0, sizeof(int) * len); //构建另一数组 int icount = 0; for(icount = 0; icount < len; icount++) { CopyA[icount] = x - a[icount]; } //比较两个指针移动的值,这里用索引代替指针 int i = len - 1, j = 0; while(i >= 0 && j < len) { if(a[i] > CopyA[j]) { switch(Ascending) { case 0: j++; break;//降序 case 1: i--; break;//升序 default:break; } } else if(a[i] == CopyA[j]) { return 1; } else { switch(Ascending) { case 0: i--; break;//降序 case 1: j++; break;//升序 default:break; } } } return 0; } int main() { int a[] = {59,41,21,10,5}; int len = 5; int x = 190; switch(Judge(a, len, x)) { case 0: printf("%d isn't exist!", x);break; case 1: printf("%d is exist!", x);break; default : break; } return 0; }