大/小端模式与位操作

文章目录

1. 大小端模式

2. 大端模式(Big-endian)

3. 小端模式(Little Endian)

4. 判断和转换大小端模式

5. 位操作

5.1 移位操作

5.2 取反操作

5.3 位与操作

5.4 位或操作

5.5 置位操作

5.6 清位操作


1. 大小端模式

大小端模式(Endianness)是指计算机系统中多字节数据的存储方式。不同的计算机系统可能采用不同的大小端模式来存储数据,这会影响到数据在内存中的排列顺序。

大小端模式的影响

  1. 数据交换: 在不同大小端模式的系统之间交换数据时,数据的解释方式会有所不同。如果不进行适当的转换,可能导致数据的错误解读。例如,一个32位整数在大端系统中为0x12345678,在小端系统中可能被解释为0x78563412。

  2. 文件格式: 某些文件格式在设计时会指定采用某种字节序。例如,网络协议通常使用大端模式,也称为"网络字节序"(Network Byte Order)。在解析这些文件或网络数据时,需要注意字节序的转换。

  3. 嵌入式系统: 在嵌入式系统开发中,嵌入式设备可能使用不同的处理器架构,不同架构可能采用不同的字节序。在与外设进行数据通信时,必须确保双方使用一致的字节序。

2. 大端模式(Big-endian)

大端模式是指数据的高字节存储在内存的低地址中,而数据的低字节存储在内存的高地址中。这种存储方式符合我们书写数字的习惯,即从高位到低位,从左到右存储。

例如,对于32位整数0x12345678:

  • 高字节(0x12)存储在低地址处
  • 低字节(0x78)存储在高地址处
地址数据
0x10000x12
0x10010x34
0x10020x56
0x10030x78

 

3. 小端模式(Little Endian)

小端模式是指数据的高字节存储在内存的高地址中,而数据的低字节存储在内存的低地址中。这种存储方式与大端模式相反。

例如,对于32位整数0x12345678:

  • 低字节(0x78)存储在低地址处
  • 高字节(0x12)存储在高地址处
地址数据
0x10000x78
0x10010x56
0x10020x34
0x10030x12

4. 判断和转换大小端模式

可以通过C语言代码来判断当前系统的大小端模式:

这段代码通过检查整数的最低字节是否存储在最低地址来判断系统的字节序。

#include <stdio.h>

int main() {
    unsigned int x = 0x12345678;
    char *c = (char*)&x;

    if (*c == 0x78) {
        printf("Little Endian\n");
    } else {
        printf("Big Endian\n");
    }

    return 0;
}

大小端模式转换

如果需要在大小端模式之间进行转换,可以使用如下方法:

这段代码实现了32位整数的字节顺序交换,可以用于大小端模式的转换。

#include <stdio.h>
#include <stdint.h>

// 交换字节顺序
uint32_t swap_endian(uint32_t val) {
    return ((val >> 24) & 0xff) |      // 移动最高字节到最低字节
           ((val << 8) & 0xff0000) |   // 移动次高字节到次低字节
           ((val >> 8) & 0xff00) |     // 移动次低字节到次高字节
           ((val << 24) & 0xff000000); // 移动最低字节到最高字节
}

int main() {
    uint32_t original = 0x12345678;
    uint32_t swapped = swap_endian(original);

    printf("Original: 0x%x\n", original);
    printf("Swapped: 0x%x\n", swapped);

    return 0;
}

5. 位操作

位操作是计算机中对二进制位进行直接操作的技术。在编程中,位操作能够高效地处理数据,通过操作特定位的值来实现一些特定的功能。位操作符直接对整数的二进制表示进行操作,因此通常比其他操作符快。

5.1 移位操作

移位操作通过移动一个数的二进制表示来实现乘法、除法、数据的快速处理等功能。移位操作分为左移和右移两种,分别用左移操作符(<<)和右移操作符(>>)表示。

示例代码

int a = 0x6; // 二进制是 0b0110
int b = a << 1; //左移操作
int c = a >> 1; //右移操作

左移操作符 << 将操作数的二进制表示向左移动指定的位数,右边补0。

  • a 的二进制表示: 0110
  • 左移一位:01101100
  • 转换为十六进制:11000xC

所以,b 的值为 0xC

右移操作符 >> 将操作数的二进制表示向右移动指定的位数,对于有符号整数,左边根据符号位补0或1,对于无符号整数,左边补0。

  • a 的二进制表示: 0110
  • 右移一位:01100011
  • 转换为十六进制:00110x3

所以,c 的值为 0x3

5.2 取反操作

取反操作是一种位操作,用来将一个数的二进制表示中的每一位取反,即把 0 变成 1,把 1 变成 0。在C语言中,取反操作使用 ~ 符号。

示例代码

int a = 0x6; // 二进制是 0b0110
int b = ~a;

取反操作符 ~ 将操作数的二进制表示中的每一位取反。

  • a 的二进制表示: 0110
  • 取反后:01101001
  • 转换为十六进制:10010x9

所以,b 的值为 0x9

5.3 位与操作

位与操作是一种位操作,用来将两个数的二进制表示中对应位置的位进行与运算。只有对应的两个二进制位都为 1 时,结果位才为 1,否则结果位为 0。在 C 语言中,位与操作使用 & 符号。

示例代码

int a = 0x6; // 二进制是 0b0110
int b = 0x7; // 二进制是 0b0111
int c = a & b;

位与操作符 & 将操作数的二进制表示中的每一位进行与运算。

  • a 的二进制表示: 0110
  • b 的二进制表示: 0111
  • 位与结果: 0110

运算如下:

  • 第1位:0 & 0 = 0
  • 第2位:1 & 1 = 1
  • 第3位:1 & 1 = 1
  • 第4位:0 & 1 = 0

所以,结果 c 的值为 0x6(十六进制),即 0b0110

5.4 位或操作

位或操作是一种位操作,用来将两个数的二进制表示中对应位置的位进行或运算。只要对应的两个二进制位中有一个为 1,结果位就为 1,否则结果位为 0。在 C 语言中,位或操作使用 | 符号。

int a = 0x6; // 二进制是 0b0110
int b = 0x7; // 二进制是 0b0111
int c = a | b;

位或操作符 | 将操作数的二进制表示中的每一位进行或运算。

  • a 的二进制表示: 0110
  • b 的二进制表示: 0111
  • 位或结果: 0111

运算如下:

  • 第1位:0 | 0 = 0
  • 第2位:1 | 1 = 1
  • 第3位:1 | 1 = 1
  • 第4位:0 | 1 = 1

所以,结果 c 的值为 0x7(十六进制),即 0b0111

5.5 置位操作

置位操作是一种常见的位操作,用来将某个变量的特定位设置为 1。在 C 语言中,可以使用位或运算符 | 和左移操作符 << 来实现置位操作。

int a = 0x6;  // 二进制是 0b0110
int a |= (1<<3);

这行代码使用了位或运算符 | 和左移操作符 << 来实现置位操作。

  • 1<<3:将 1 左移 3 位,结果是 0b1000(二进制),即十六进制的 0x8
  • a |= 0b1000:将 a0b1000 进行位或运算。

计算过程:

  • a 的二进制表示: 0110
  • 1<<3 的二进制表示: 1000
  • 位或结果: 1110

运算如下:

  • 第1位:0 | 0 = 0
  • 第2位:1 | 0 = 1
  • 第3位:1 | 0 = 1
  • 第4位:0 | 1 = 1

所以,结果 a 的值为 0xE(十六进制),即 0b1110

5.6 清位操作

清位操作是将某个变量的特定位清零的一种操作。通过使用位与运算符 & 和按位取反操作符 ~ 可以实现清位操作。

int a = 0x6;  // 二进制是 0b0110
int a &= ~(1<<2);

这行代码使用了位与运算符 & 和按位取反操作符 ~ 来实现清位操作。

  • 1<<2:将 1 左移 2 位,结果是 0b0100(二进制),即十六进制的 0x4
  • ~(1<<2):对 0b0100 进行按位取反,结果是 0b1011
  • a &= 0b1011:将 a0b1011 进行位与运算。

计算过程:

  • a 的二进制表示: 0110
  • ~(1<<2) 的二进制表示: 1011
  • 位与结果: 0010

运算如下:

  • 第1位:0 & 1 = 0
  • 第2位:1 & 0 = 0
  • 第3位:1 & 1 = 1
  • 第4位:0 & 1 = 0

所以,结果 a 的值为 0x2(十六进制),即 0b0010

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/785137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言之数据在内存中的存储(1),整形与大小端字节序

目录 前言 一、整形数据在内存中的存储 二、大小端字节序 三、大小端字节序的判断 四、字符型数据在内存中的存储 总结 前言 本文主要讲述整型包括字符型是如何在内存中存储的&#xff0c;涉及到大小端字节序这一概念&#xff0c;还有如何判断大小端&#xff0c;希望对大…

python极速入门笔记(三)

1. 函数 #定义函数""" def 函数名&#xff08;参数&#xff09;:...return ** """ def calc_BMI(weight,height):BMIweight/(height**2)if BMI<18.5:category"偏瘦"elif BMI<25:category"正常"elif BMI<30:catego…

红外光气体检测:1.分子振动与红外吸收、检测系统的基本模型和红外敏感元件

分子振动与红外吸收 分子偶极矩的变化频率与分子内原子振动状态有关&#xff1a;μqd&#xff0c;其中μ是偶极矩&#xff0c;q是电荷&#xff0c;d是正负电荷中心距离。 分子在…

怎样优化 PostgreSQL 中对布尔类型数据的查询?

文章目录 一、索引的合理使用1. 常规 B-tree 索引2. 部分索引 二、查询编写技巧1. 避免不必要的类型转换2. 逻辑表达式的优化 三、表结构设计1. 避免过度细分的布尔列2. 规范化与反规范化 四、数据分布与分区1. 数据分布的考虑2. 表分区 五、数据库参数调整1. 相关配置参数2. 定…

深度学习-梯度下降算法-NLP(五)

梯度下降算法 深度学习中梯度下降算法简介找极小值问题数学上求最小值梯度梯度下降算法 找极小值问题在深度学习流程中深度学习整体流程图求解损失函数的目标权重的更新 深度学习中梯度下降算法简介 找极小值问题 引子&#xff1a; 我们训练一个人工智能模型&#xff0c;简单…

记录一次Nginx的使用过程

一、Docker安装配置nginx 1.拉取镜像 docker pull nginx2.创建挂载目录 启动前需要先创建Nginx外部挂载目录文件夹 主要有三个目录 conf&#xff1a;配置文件目录log&#xff1a;日志文件目录html&#xff1a;项目文件目录&#xff08;这里可以存放web文件&#xff09; 创建挂…

【沐风老师】3DMAX建筑体块生成插件BuildingBlocks使用方法详解

BuildingBlocks建筑体块生成插件使用方法详解 听说你还在手动建配景楼&#xff1f;有了BuildingBlocks这个插件&#xff0c;一分钟搞定喔&#xff01; 3DMAX建筑体块生成插件BuildingBlocks&#xff0c;用于快速自定义街道及生成配景楼区块。 【适用版本】 3dMax2019及更高版…

鸿蒙语言基础类库:【@ohos.process (获取进程相关的信息)】

获取进程相关的信息 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…

【专项刷题】— 位运算

常见类型介绍&#xff1a; & &#xff1a;有 0 就是 0 | &#xff1a;有 1 就是 1 ^ &#xff1a;相同为 0 &#xff0c;相异为 1 或者 无进位相加给定一个数确定它的二进制位的第x个数是0还是1&#xff1a;将一个数的二进制的第x位改成1&#xff1a;将一个数的二进制的第x…

无人机在交通管理方面的应用与潜力

随着智能化和数字化技术的发展&#xff0c;无人机已经成为智慧交通管理体系中的重要一环。无人机能够搭载各种专业设备&#xff0c;如超清摄像头、红外热成像摄像头、目标跟踪器等&#xff0c;从而完成多任务的数据采集和快速机动的任务执行。这些数据通过无线传输实时回传&…

RxJava学习记录

文章目录 1. 总览1.1 基本原理1.2 导入包和依赖 2. 操作符2.1 创建操作符2.2 转换操作符2.3 组合操作符2.4 功能操作符 1. 总览 1.1 基本原理 参考文献 构建流&#xff1a;每一步操作都会生成一个新的Observable节点(没错&#xff0c;包括ObserveOn和SubscribeOn线程变换操作…

YOLOv10改进 | 主干篇 | 低照度增强网络PE-YOLO改进主干(改进暗光条件下的物体检测模型)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络PE-YOLO中的PENet&#xff0c;PENet通过拉普拉斯金字塔将图像分解成多个分辨率的组件&#xff0c;增强图像细节和低频信息。它包括一个细节处理模块&#xff08;DPM&#xff09;&#xff0c;用于通过上下文分支和边…

【安全设备】日志审计

一、什么是日志审计 日志审计是一站式的日志数据管理平台&#xff0c;主要致力于提供事前预警、事后审计的安全能力&#xff0c; 通过对日志数据的全面采集、解析和深度的关联分析&#xff0c;及时发现各种安全威胁和异常行为事件。日志审计是指通过集中采集信息系统中的各类信…

Chain-of-Verification Reduces Hallucination in Lagrge Language Models阅读笔记

来来来&#xff0c;继续读文章了&#xff0c;今天这个是meta的研究员们做的一个关于如何减少LLM得出幻觉信息的工作&#xff0c;23年底发表。文章链接&#xff1a;https://arxiv.org/abs/2309.11495 首先&#xff0c;这个工作所面向的LLM的问答任务&#xff0c;是list-based q…

怎样优化 PostgreSQL 中对日期时间范围的模糊查询?

文章目录 一、问题分析&#xff08;一&#xff09;索引未有效利用&#xff08;二&#xff09;日期时间格式不统一&#xff08;三&#xff09;复杂的查询条件 二、优化策略&#xff08;一&#xff09;使用合适的索引&#xff08;二&#xff09;规范日期时间格式&#xff08;三&a…

前沿重器[53] | 聊聊搜索系统6:精排

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

IDEA启动tomcat之后控制台出现中文乱码问题

方法1&#xff1a; 第一步&#xff1a;file--setting--Editor--File Encodings 注意页面中全部改为UTF-8&#xff0c;然后apply再ok 第二步&#xff1a;Run--Edit Configuration&#xff0c;将VM options输入以下值&#xff1a; -Dfile.encodingUTF-8 还是一样先apply再ok …

视频图文理解关联技术与创业团队(二)

上一篇&#xff1a;google gemini1.5 flash视频图文理解能力初探&#xff08;一&#xff09;提到了gemini 1.5 flash 可以对视频进行理解以及分析&#xff0c;但是整体在检索任务上效果不佳。 这几天参加了人工智能大会 网上收集&#xff0c;看一看有相似能力的一些技术点、创…

生物素化果胶粒子包裹药物阿霉素;DOX/Bio-PEC

生物素化果胶粒子包裹药物阿霉素&#xff08;DOX/Bio-PEC&#xff09;是一种新型的药物载体系统&#xff0c;结合了生物素和果胶多糖的优势&#xff0c;旨在提高药物的靶向性和控释性能。以下是对该系统的详细解析&#xff1a; 一、生物素化果胶粒子的制备 原理与步骤&#xff…

独立开发者系列(22)——API调试工具apifox的使用

接口的逻辑已经实现&#xff0c;需要对外发布接口&#xff0c;而发布接口的时候&#xff0c;我们需要能自己简单调试接口。当然&#xff0c;其实自己也可以写简单的代码调试自己的接口&#xff0c;因为其实就是简单的request请求或者curl库读取&#xff0c;调整请求方式get或者…