欢迎光临散文网 会员登陆 & 注册

C语言位操作技巧 之 异或

2022-11-16 10:10 作者:GC_CH  | 我要投稿

        异或(^), 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0. 也就是只有两个操作数不等时结果为1, 否则结果为0;

加密和解密

    原理 : a ^ b ^ b = a

    解释 : 一个数异或同一个数两次, 结果等于自身.   

    可以使用异或运算对一个数进行加密, 只需要将这个数与密钥(另一个数)进行异或运算, 结果就是密文. 解密的时候, 将密文与密钥进行异或运算, 结果就是原文. 但是这种加密和解密方式很简单, 容易被破解. 异或运算通常是高级加密算法的一部分.

    比如, a = 7, b = 14.

    加密 c = a ^ b = 0000 0111 ^ 0000 1110 = 0000 1001 = 9

    解密 a = c ^ b = 0000 1001 ^ 0000 1110 = 0000 0111 = 7

交换值

    原理 : a1 = a ^ b, b1 = a1 ^ b, a2 = a1 ^ b1

    解释 : 依次进行计算上面三个表达式后, a2 == b, b1 == a. 首先第1个式子可以看成用b对 a 加密, 第2个式子就是对密文a1解密, 那么结果自然是a, 也就是有 b1 == a. 第3个式子看成用b1对密文a1解密, 由于 b1 == a, a1 = b ^ a, 所以结果是b, 也就是 a2 == b.

    所以, C语言中可以实现如下函数来交换两个数的值(注意: 应该先判断指针是否为空!)

    

取反标志位

    原理 : 1 ^ a = ~a,  其中, a = 0 或 1.

    解释 : 这里的运算只针对一个二进制位, 1 ^ 一个数等于那个数取反. 因此, 可以用异或1来对某个二进制位取反, 这种操作是很常见的, 比如判断复选框按钮是否选中, 鼠标点击一下, 复选框就选中, 再点一下就取消选中.

    例子 : 对 7 的位2取反,   0111 ^ 0100 = 0011 = 3.

    再取反一次, 0011 ^ 0100 = 0111 = 7.

  设置标志位

    原理 : 0 ^ a = a,  其中, a = 0 或 1.

    解释 : 这里的运算只针对一个二进制位, 0 ^ 一个数等于那个数. 可以用以下式子来将某个标志位设置为另一个数的指定位的值:

a ^ = (a ^ b) & mask

    其中mask是该位掩码(只有该位为1, 其余位全为0的一个数), a和b是两个整数. 该式子首先计算 a ^ b, 相当于一个加密过程; 结果 & mask, 则只保留了固定位的值, 其余位全部为0; 最后计算 a ^= , 由于为0的位异或a的对应位后, a的对应位的值不变, 因此只有指定位修改了a的对应位. 而指定位是加密结果, 再异或一次a的对应位后, 结果是b的对应位.

    相当于结合了前面说的加密解密以及交换值.

     例子1 : 使用4来设置7的位2, 0111 ^ ((0100 ^ 0111) & 0100) = 0111 ^ (0011 & 0100) = 0111 ^ 0000 = 0111 = 7.

    7 的位2 变为 4的位2 = 1;

    例子2 : 使用3来设置7的位2, 0111 ^ ((0011 ^ 0111) & 0100) = 0111 ^ (0100 & 0100) = 0111 ^ 0100 = 0011 = 3.

    7 的位2 变为 3的位2 = 0.

    

C语言位操作技巧 之 异或的评论 (共 条)

分享到微博请遵守国家法律