16_位运算符分析

作者: 编程半岛 | 来源:发表于2018-03-08 12:46 被阅读8次

关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别

1. C语言中的位运算符

位运算符直接对bit位进行操作,其效率最高

2. 左移和右移注意点

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

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

#include <stdio.h>

int main()
{
    printf("%d\n", 0x01 << 2 + 3);
    
    return 0;
}

输出结果:

32

总结:四则运算的优先级高于位运算

4. 位运算防错准则

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

小技巧:

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

5. 不借助第三个变量交换两个整形变量的值(位运算实现)

#include <stdio.h>

// 通过异或运算来实现两个整形值的交换
#define SWAP(a, b)  \
{                   \
    a = a ^ b;      \
    b = a ^ b;      \
    a = a ^ b;      \
}

int main()
{
    int i = 1;
    int j = 2;
    
    printf("i = %d, j = %d\n", i, j);
    
    SWAP(i, j);
    
    printf("i = %d, j = %d\n", i, j);
    
    return 0;
}

6. 位运算符和逻辑运算符的区别

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

int main()
{
    int i = 0;
    int j = 0;
    int k = 0;
    
    if( ++i | ++j & ++k )
    {
        printf("Run here...\n");
    }
    
    printf("%d\n", i);
    printf("%d\n", j);
    printf("%d\n", k);

    return 0;
}

输出结果:

Run here...
1
1
1

总结:注意区分逻辑运算的与或非运算和位运算中的与或非运算

7. 小结

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

声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!

相关文章

  • 16_位运算符分析

    关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别 1. C语言中的位...

  • 理解C语言位运算符

    位运算符 位运算符包括:& 、|、^、~、<<、>> 分析 & 按位与操作,按二进制位进行"与"运算。| 按位或运...

  • javaSE学习-位运算符

    & 位与 | 位或 位运算符会将数字转化为二进制再进行计算。 分析: 上面这些运算符会将数字转换成2进制再进行运算...

  • C语言 第13节 位运算符

    位运算符 按位与分析 5 & 7 = 521 & 7 = 55 & 1 = 15 & 10 = 0-5 & 10 ...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • Python(七十七)管道、日志与全站爬取

    16_管道、日志与全站爬取/myspider02/myspider02/items.py: 16_管道、日志与全站...

  • 位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作 位与运算符 位与运算符(&)可以对两个数的比特位进行...

  • 基础运算符

    [使1. 按位与运算符(&](#1. 按位与运算符(&)[按位或运算符 | ](#2. 按位或运算符(|)) 1....

  • python学习第二天 基础知识二

    运算符 +、-、、/、//(整除)、*(幂运算符)、%(取余) 输出结果 位运算符 &位与,|位或,左移<<,右移...

网友评论

    本文标题:16_位运算符分析

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