zoukankan      html  css  js  c++  java
  • 位运算符

    位运算符分析

    C语言中位运算符直接对bit位进行操作,其效率最高。

    注意点:

    • 左操作数必须为整数类型
      • char和short被隐式转换为int后进行移位操作
    • 右操作数的范围必须为:[0-31]
    • 左移运算符 << 将运算数的二进制左移
      • 规则:高位丢弃,低位补0
    • 右移运算符 >> 把运算数的二进制位右移
      • 规则:高位补符号位,低位丢弃

    一个有趣的问题

    0x1 << 2 + 3 的值会是什么?

    例子1:位操作符的使用

    #include<stdio.h>
    
    int main()
    {
        printf("%d
    ",3<<2); // 12
        printf("%d
    ",3>>2); // 0
        printf("%d
    ",0x1 << 2 +3); // 32
        printf("%d
    ",-1>>1); // -1
        printf("%d
    ",3 << -1); // 不同的编译器结果不一样,gcc 1
    
        return 0;
    }
    
    

    防错准则:

    • 避免位运算符、逻辑运算符和数学运算符同时出现在一个表达式中
    • 当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号来表达计算顺序

    小tip:

    • 左移n位相当于乘以2的n次方,但效率比数学运算高
    • 右移n位相当于除以2的n次方,但效率比数学运算高

    交换两个变量的值

    #include<stdio.h>
    
    #define SWAP(a,b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    
    #define SWAP1(a,b)
    {
        a = a + b; 
        b = a - b;
        a = a - b;
    }
    
    #define SWAP2(a,b)
    {
        a = a^b;
        b = a^b;
        a = a^b;
    }
    
    int main()
    {
        int a = 200,b = 300;
        printf("a = %d,b = %d
    ",a,b);
        SWAP(a,b);
        printf("a = %d,b = %d
    ",a,b);
        SWAP1(a,b);
        printf("a = %d,b = %d
    ",a,b);
        SWAP2(a,b);
        printf("a = %d,b = %d
    ",a,b);
        return 0;
    }
    
    

    第一种方式引入了第三个变量,第二种,当两个大数相加可能产生溢出,第三种较好。

    小结

    • 位运算符只能用于整数类型
    • 左移和右移运算符的右操作数的范围在[0,31]
    • 位操作符没有短路规则,所有操作数都会求值
    • 位运算符的效率高于四则运算和逻辑运算
    • 运算优先级:四则运算 > 位运算 > 逻辑运算
  • 相关阅读:
    POJ 3713 Transferring Sylla【Tarjan求割点】
    Tarjan算法【强连通分量】
    POJ 1273 Drainage Ditches【最大流模版】
    CDOJ 1960 构造哈密顿路径
    HDU 1384 Intervals【差分约束-SPFA】
    POJ 1364 / HDU 3666 【差分约束-SPFA】
    【SPFA与Dijkstra的对比】CDOJ 1961 咸鱼睡觉觉【差分约束-负权最短路径SPFA】
    CDOJ 1965 连通域统计【DFS】
    CDOJ 1964 命运石之门【最短路径Dijkstra/BFS】
    最小生成树模板【kruskal & prim】
  • 原文地址:https://www.cnblogs.com/yanyun888/p/9152016.html
Copyright © 2011-2022 走看看