位运算符

来源:互联网 发布:伊宁关键字排名优化 编辑:程序博客网 时间:2024/06/05 00:27

1 位运算符分析

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

这里写图片描述

2 左移和右移注意点

  • 左操作数必须为整数:char和short被隐式转换为int后进行移位操作。

  • 右操作数的范围必须为:[0,31]。

  • 左移运算符<<将运算数的二进制位左移:
    • 规则:高位丢弃,低位补0。
  • 右移运算符>>把运算数的二进制位右移:
    • 规则:高位补符号位,低位丢弃。

3 有趣的问题

这里写图片描述

实例分析:位运算符初探

#include <stdio.h>int main(){    printf("%d\n", 3 << 2);         //12    printf("%d\n", 3 >> 1);         //1    printf("%d\n", -1 >> 1);        //-1    printf("%d\n", 0x01 << 2 + 3);  //32    printf("%d\n", 3 << -1); // oops! 不同编译器结果不同    return 0;}

4 小贴士

  • 防错准则:
    • 避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中。
    • 当位运算,逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号()来表达计算次序。
  • 小技巧:
    • 左移n位相当于乘以2的n次方,但效率比数学运算符高。
    • 右移n位相当于除以2的n次方,但效率比数学运算符高。

编程实验:交换两个整型变量的值

#include <stdio.h>#define SWAP1(a, b)    \{                      \    int t = a;         \    a = b;             \    b = t;             \}#define SWAP2(a, b)    \{                      \    a = a + b;         \    b = a - b;         \    a = a - b;         \}#define SWAP3(a, b)    \{                      \    a = a ^ b;         \    b = a ^ b;         \    a = a ^ b;         \}int main(){    int a = 1;    int b = 2;    printf("a = %d\n", a);     printf("b = %d\n", b);     SWAP3(a ,b);    printf("a = %d\n", a);     printf("b = %d\n", b);     return 0;}

5 位运算与逻辑运算不同

  • 位运算没有短路规则,每个操作数都参与运算。
  • 位运算的结果为整数,而不是0或1。
  • 位运算优先级高于逻辑运算优先级。

实例分析:混淆概念的判断条件

#include <stdio.h>int main(){    int i = 0;    int j = 0;    int k = 0;    if( ++i | ++j & ++k )    {        printf("Run here...\n");    }    return 0;}

6 小结

  • 位运算只能用于整数类型。
  • 左移和右移运算符的右操作数范围必须为[0,31]。
  • 位运算没有短路规则,所有操作数均会求值。
  • 位运算的效率高于四则运算和逻辑运算。
  • 运算优先级:四则运算 > 位运算 > 逻辑运算。
原创粉丝点击