逍遥自在学C语言 | 位运算符>>的高级用法

前言

在上一篇文章中,我们介绍了<<运算符的高级用法,本篇文章,我们将介绍>> 运算符的一些高级用法。

逍遥自在学C语言 | 位运算符>>的高级用法

一、人物简介

  • 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。

逍遥自在学C语言 | 位运算符>>的高级用法

  • 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。

逍遥自在学C语言 | 位运算符>>的高级用法

二、优化除法运算

  • 除法运算需要比位移运算需要更多的计算资源,某些情况下采用位移运算可以提高性能

  • 代码示例

#include <stdio.h>
int main()
{
    int a = 1024;
    int b = a / 8; // 整除8
    int c = a >> 3; // 相当于除以8
    printf("b = %d, c = %d\n", b, c);
    return 0;
}
  • 每右移一位相当于除以2, a >> 3相当于a/(2*2*2) = a/8
  • 运行结果

逍遥自在学C语言 | 位运算符>>的高级用法

三、获取字节序

  • 大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

  • 小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

  • 右移运算符还可以用于获取当前系统的字节序(即大端序或小端序)

  • 比如数字 0x1234在内存中的表示形式为:

    大端模式:
    低地址 -----------------> 高地址
    0x12 | 0x34

    小端模式:
    低地址 ------------------> 高地址
    0x34 | 0x12

  • 代码示例

#include <stdio.h>
int main()
{
    short int i = 0x1234; // 假设i在内存中的地址为0x1000
    char *p = (char *)&i; // 将i的地址转换为字符型指针,即指向0x1000的字节型指针
    if (*p == 0x12) // 判断*p的值是否等于0x12,如果等于则为大端序,否则为小端序
    {
        printf("大端序\n");
    }
    else
    {
        printf("小端序\n");
    }
    return 0;
}
  • 运行结果

逍遥自在学C语言 | 位运算符>>的高级用法

四、提取二进制数的某一位

  • 将一个二进制数右移n位,再与1进行按位与运算,得到的结果就是这个二进制数的第n位(从第0位开始算)
  • 例如,将1011右移2位,得到的结果是10,再与1进行按位与运算,得到的结果是0,即1011的第二位是0
  • 代码示例
#include <stdio.h>
int main()
{
    int a = 0b1011;
    int b = (a >> 2) & 1; // 提取a的第二位,即0
    printf("第二位的值为 %d\n", b);
    return 0;
}
  • 运行结果

逍遥自在学C语言 | 位运算符>>的高级用法

五、提取二进制数的多个连续位

  • 将一个二进制数右移n位,再与一个掩码进行按位与运算,得到的结果就是这个二进制数从第n位开始的若干位
  • 例如,将1011011右移3位,得到的结果是1011,再与111进行按位与运算,得到的结果是011,即1011011从第3位开始的三位是011
  • 代码示例
#include <stdio.h>
int main()
{
    int a = 0b1011011;
    int b = (a >> 3) & 0b111; // 提取a从第3位开始的3位,即101
    printf("b = %d\n", b);
    return 0;
}
  • 运行结果,3 (二进制为0b011)

逍遥自在学C语言 | 位运算符>>的高级用法

六、浮点数向下舍入为整数

  • 这种用法通常用于嵌入式系统中,因为某些嵌入式处理器没有浮点数运算单元,只能使用整数运算单元来处理浮点数

  • 将一个浮点数乘以一个定点数的精度,并将结果向下取整,可以得到一个整数近似值

  • 例如,将一个浮点数乘以1000,再将结果右移10位,得到的结果就是这个浮点数乘以1000并向下取整的整数值

  • 代码示例

#include <stdio.h>
int main()
{
    float x = 3.1415926;
    int a = (int)(x * 1000.0f) >> 10; // 将x乘以1000并向下取整
    printf("向下取整后的数值为 %d\n", a);
    return 0;
}
  • 运行结果

逍遥自在学C语言 | 位运算符>>的高级用法

小结

通过这篇文章,我们学会了用位运算符>>的5种高级用法

1、优化除法运算

2、获取字节序

3、提取二进制数的某一位

4、提取二进制数的多个连续位

5、浮点数向下舍入为整数

?欢迎各位 ?点赞 ⭐收藏 ?评论,如有错误请留言指正,非常感谢!

原文链接:https://www.cnblogs.com/Wayne123/p/17324428.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:逍遥自在学C语言 | 位运算符>>的高级用法 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • OpenCV实现图像连通域

    下面是OpenCV实现图像连通域的完整攻略: 1. 简介 图像连通域是指一组具有相同像素值的像素的集合。在图像分割、形状识别等领域中,这是一个非常重要的概念。OpenCV提供了一些方法来计算图像中不同的连通域。在这篇文章中,我将向你展示如何用OpenCV实现图像连通域。 2. 实现步骤 OpenCV通过扫描整个图像,检测相邻像素值相同的像素,将这些像素标记为…

    C 2023年5月23日
    00
  • socket多人聊天程序C语言版(一)

    下面是“socket多人聊天程序C语言版(一)”的完整攻略。 一、前置知识 在学习本文前,需要掌握以下C语言知识:- socket编程基础- 线程基础- 指针基础 二、程序结构 本程序主要分为四个模块:客户端、服务端、公共头文件和Makefile。 1. 公共头文件 common.h:包含了各种结构体和宏定义,以及客户端和服务端公共使用的函数的声明。 2. …

    C 2023年5月23日
    00
  • 如何实现循环队列

    如何实现循环队列? 循环队列是一种环形数据结构,它与普通队列的不同之处在于,当队列满时,新元素会插入到队列头部,而不是队列尾部。循环队列的实现可以使用数组或链表来完成。 以下是使用数组实现循环队列的攻略: 为了实现循环队列,我们需要先声明一个数组来存储队列元素,还需要确定两个指针front和rear,分别指向队列的头部和尾部。 初始化队列时,将front和r…

    C 2023年5月23日
    00
  • C语言实现扫雷代码

    下面是“C语言实现扫雷代码”的完整攻略: 1. 设计数据结构 在扫雷游戏中,我们需要用到以下数据结构: 1.1 格子(Cell) 每一个格子有一个横坐标、一个纵坐标,以及一个当前状态(未打开、已标记、已揭开)和一个值(0 – 8代表周围8个格子中地雷的数量,9代表该格子本身就是地雷)。 struct Cell { int x; // 横坐标 int y; /…

    C 2023年5月23日
    00
  • C语言简明讲解预编译的使用

    首先我们需要了解预编译器是什么,预处理指令的作用是什么,在C语言中如何使用预编译器。 什么是预编译器? 预编译器是C语言编译器的一部分,它是在编译正式开始之前处理源代码的一段程序。预编译器处理的代码包括头文件和宏定义等,在编译正式开始之前,预编译器将对这些代码进行处理并将处理后的代码输出,交给编译器进行编译。预编译器的处理结果就是一个纯C语言代码的文件。 预…

    C 2023年5月23日
    00
  • VC基于ADO技术访问数据库的方法

    VC基于ADO技术访问数据库的方法 ADO是一种微软的数据访问技术。在VC中通过ADO可以很方便地访问数据库。下面将介绍VC基于ADO技术访问数据库的方法。主要分为以下几个步骤: 第一步:导入ADO头文件 在VC工程中,需要导入ADO头文件,才能使用ADO相关的对象和方法。在程序中需要包含头文件“#include ”和“#import ‘msado15.dl…

    C 2023年5月23日
    00
  • 一道超经典的C++结构体的题目

    我来为您详细讲解C++结构体问题的攻略。 一道超经典的C++结构体的题目 题目描述 假设有一个Person结构体,需要包含姓名、年龄、身高这三个属性: struct Person { string name; int age; float height; }; 请编写一个程序,能够完成以下操作: 创建一个Person结构体的变量,用指定的姓名、年龄、身高对其…

    C 2023年5月24日
    00
  • MySQL中多个left join on关联条件的顺序说明

    在 MySQL 的多个 LEFT JOIN 操作中,我们需要在 ON 子句中指定关联条件。正确顺序的设置可以有效优化查询性能,同时保证关联结果的正确性。 如何设置关联条件的顺序?我们可以遵循以下步骤: 从主表开始,其余表按照查询的依赖关系顺序连接。 对于非主表,保证其实际关联的表能够尽早地被筛选,有效缩小数据集的范围,减少查询所需的时间。 为了更好的理解这个…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部