zoukankan      html  css  js  c++  java
  • 有趣的位运算-异或

    ^(异或)这个位操作的基本理论我就不细说了。这里主要总结一下该操作的妙用。

    1数字交换

    有int型整数a和b,怎样将其互换?

    常见方法是借助一个空间c存储临时变量

    int c;
     
    c = a;
    a = b;
    b = c;

    那能不能不用c就可以实现交换呢?有

    a = a + b; 
    b = a - b; 
    a = a - b;

    这么做固然达到要求了,但是隐藏一个弊端。若a+b大于int型最大值呢?(完全有可能的啊)

    怎么解决上述问题:异或运算

    a = a ^ b; 
    b = a ^ b;  
    a = a ^ b; 

    这里用到了异或的一个性质:一个数异或同一个数两次还是原数。举个例子,32(00100000)与42(00101010)异或两次还是32,如下所示:

      00100000
    ^ 00101010
    结果1 00001010
    ^ 00101010
    结果2

    00100000

    2文件简单加密

    我们在数字交换的例子中已经知道了异或运算的一个性质(一个数异或同一个数两次还是原数)。那么我们可以利用这个性质实现文件加密,为什么呢?因为计算机中的文件都以二进制存储。我们让一段二进制异或一个数字例如88,那么这段二进制就加密了,只有再异或一次88才能解密。

     3性质总结
    1、交换律(a ^ b = b ^ a)
    2、结合律(即( a ^ b ) ^ c = a ^ ( b ^ c ) )
    3、对于任何数x,都有x ^ x = 0,x ^ 0 = x
    4、自反性 a ^ b ^ b = a ^  0 = a

    结合这几个性质可以用有趣的方法解决上述类似问题。

  • 相关阅读:
    select服务器模型
    网络编程-并发服务器基础
    生产者消费者模型
    readv()和write()sendfile()
    snprintf函数的用法
    struct stat结构体的简介
    half-socket
    结构体struct sockaddr_in, struct sockaddr,struct in_addr
    int main(int argc,char* argv[])的作用
    fgets和fputs,fread和fwrite,fscanf,和fprintf用法小结
  • 原文地址:https://www.cnblogs.com/ouym/p/8806350.html
Copyright © 2011-2022 走看看