• 有趣的位运算-异或


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

    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

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

  • 相关阅读:
    宏任务、微任务与Event Loop
    puppteer的使用
    docker的使用 -- windows
    vscode集成eslint
    删除git中无用的大文件
    git 使用
    利用chrome devtool 观察页面占用内存
    JS对象-不可扩展对象、密封对象、冻结对象
    数学
    素数 + 背包
  • 原文地址:https://www.cnblogs.com/ouym/p/8806350.html
Copyright © 2020-2023  润新知