位运算

作者: silasjs | 来源:发表于2018-04-08 15:17 被阅读2次

    位运算

    1. &:按位与

    • 规律:
      • 一假则假
      • 任何位上的数和1相&得到的结果还是那个数

    2. |:按位或

    • 规律:
      • 一真则真

    3. ^:按位异或

    • 规律:
      • 不同为1,相同为0
      • 异或的结果和参与运算的顺序没有关系
      • 相同的两个数异或等于0
      • 任何一个数异或上0,结果不变
      • 任何一个数异或上同一个数两次,结果不变

    4. ~:按位取反

    5. <<:左移(左移后,溢出位去掉,后面补0。)

    • 规律:
      • 左移就是用左移的数乘以2的移动次幂
    例如:
    9 << 1 == 9 * 2(1) == 18
    9 << 2 == 9 * 2(2) == 9 * 4 == 36
    

    注意点:由于左移运算,被移动的数最高位会被抛弃,所以左移有可能会改变一个数的正负形

    6. >>:右移(右移后,溢出位去掉,前面补上符号位,符号位是什么就补什么。)

    • 规律:
      • 右移就是用右移的数除以2的移动次幂
    例如:
    9 >> 1 == 9 / 2(1) == 4
    9 >> 2 == 9 / 2(2) == 9 / 4 == 2
    

    注意:负数的左移右移是补码在移动,因为负数都是以补码的形式存储在内存中的

    7. 应用场景

    如果想让某一个数乘以或者除以2的n次幂,最高效的运算方法就是左移右移n位。

    8. 用位运算实现两个数的交换

    int a = 5;
    int b = 10;
    
    1. 中间量方式
    int temp = a;
    a = b;
    b = temp;
    
    1. 无中间量
    a = a + b;//a = 15
    b = a - b;//b = 15 - b = 原来a的值
    a = a - b;//a = 15 - b(原来a的值) = 原来b的值
    
    1. 位移
    a = a ^ b;
    b = a ^ b;//b = (a ^ b) ^ b = a
    a = a ^ b;//a = a ^ (a ^ b) = b
    

    相关文章

      网友评论

          本文标题:位运算

          本文链接:https://www.haomeiwen.com/subject/irtmhftx.html