异或(^)在C语言中的理解以及应用
异或(^)在C语言中是位运算的一种,我们用表格来对它进行总结:
^ (x^y) | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
总的来说,位运算都相对比较简单,重点是我们需要理解它的应用场景。
利用位运算无中间变量交换
普通的交换:
int nValue1 = 0x1111111;
int nValue2 = 0x2222222;
//交换
int nTemp = nValue1;
nValue1 = nValue2;
nValue2 = nTemp;
在该代码中我们可以发现我们浪费了中间变量nTemp的内存(虽然不大噢),如果希望节约这4个字节的内存(int),我们可以用到异或:
int main(int argc, char* argv[])
{
int nValue1 = 0x1;
int nValue2 = 0x2;
printf("%p, %p\r\n", nValue1, nValue2);
nValue1 = nValue1 ^ nValue2;
nValue2 = nValue1 ^ nValue2;
//nValue2 变成了原来的nValue1;
nValue1 = nValue1 ^ nValue2;
printf("%p, %p\r\n", nValue1, nValue2); 12 return 0; 13 }
加密解密中的应用
加密算法与编码算法最本质的区别在于:加密算法需要“密钥”(key)。
而异或天生适用于加密和解密:
void EncryptBlock(char* pData, int nLen, char* pKey, int nKeyLen)
{
for (size_t i = 0; i < nLen; i++)
{
pData[i] ^= pKey[i%nKeyLen];
}
}
int main(int argc, char* argv[])
{
char szData[] = "helloworld";
EncryptBlock(szData, strlen(szData),
"hello", strlen("hello"));
return 0;
}
观察以上算法我们可以发现:
- nValue ^ key 就会变为密文
- 密文 ^ key 变回原文
非常多的加密解密算法中,都使用了异或运算(比如AES、MD5、SHA256、CRC)。