大/小端模式与位操作

文章目录

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.mzph.cn/diannao/43362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习之 scala基础(补充)

scala基础&#xff1a; hello world: 写scala可运行文件的注意事项1、如果一个scala文件要运行&#xff0c;class要改成object2、如果是class&#xff0c;就仅单纯代表一个类&#xff0c;如果是object代表的是单例对象3、scala语法中&#xff0c;一句话结束不需要加分号4、sca…

Spring的AOP基础以及AOP的核心概念

2. AOP基础 学习完spring的事务管理之后&#xff0c;接下来我们进入到AOP的学习。 AOP也是spring框架的第二大核心&#xff0c;我们先来学习AOP的基础。 在AOP基础这个阶段&#xff0c;我们首先介绍一下什么是AOP&#xff0c;再通过一个快速入门程序&#xff0c;让大家快速体…

Ubuntu配置GitHub(第一次clone/push)

文章目录 1. 安装Git&检查连接2. 注册GitHub3. 生成&GitHub添加SSH3.1. 检查&删除已有id_rsa3.2. 生成SSH3.3. GitHub添加id_rsa.pub SSH3.4. 检查SSH 4. 继续开发可以参考参考 1. 安装Git&检查连接 安装 sudo apt-get install git检查SSH连接 ssh -T gitgi…

【工具分享】零零信安攻击面管理平台

文章目录 00SEC-ASM™功能介绍功能演示 最近闲来无事&#xff0c;到处网上冲浪&#xff0c;无意间发现了长亭云图攻击面管理平台&#xff0c;无奈需要授权才能使用&#xff0c;于是就找到了平替&#xff1a;零零信安攻击面管理平台。 长亭云图攻击面管理平台&#xff1a;https:…

vue2封装向上滚动组件

目录 1.代码2.使用 1.代码 <template><div class"marquee-wrap" :style"{height: height px}"><ul class"marquee-list":style"animateUpStyle"v-on:mouseover"myMouseover"v-on:mouseout"myMouseout…

工厂方法模式在金融业务中的应用及其框架实现

引言 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它定义了一个创建对象的接口&#xff0c;但由子类决定实例化哪一个类。工厂方法模式使得类的实例化延迟到子类。在金融业务中&#xff0c;工厂方法模式可以用于创建不同类型…

惠普Z系列AI台式工作站家族

聚焦智能制造、数据科学及人工智能、3D图形图像等高精尖领域&#xff0c;为客户提供高性能、强稳定、强拓展的台式工作站产品及解决方案。 HP Z1 Tower G9 VR创作 / 设计建模 适用于VR内容创作及设计建模等工作可支持128G DDR5内存&#xff0c;第十四代Intel Core™ vPro™ CPU…

Windows下cmd快速到达指定文件位置(三种方法)

一、图形界面 第一步&#xff1a; 点击此图标 在搜索框输入“cmd”&#xff0c;打开命令提示符 或者&#xff1a; 快捷键windowR&#xff0c;点击“确定” 第二步&#xff1a; 先进盘 比如d盘&#xff0c;输入 d: &#xff08;注意英文输入法&#xff09;&#xff0c;再进文件…

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

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

充分利用视觉信息多问多答合成数据,提升多模态大模型数学推理能力

©PaperWeekly 原创 作者 | 史文浩 单位 | 电子科技大学 论文题目&#xff1a; Math-LLaVA: Bootstrapping Mathematical Reasoning for Multimodal Large Language Models 论文链接&#xff1a; https://arxiv.org/abs/2406.17294 开源链接&#xff1a; https://github.c…

最新国内免费使用GPT4o、4.0、3.5 的方法

为了方便大家对GPT有更好的了解&#xff0c;这里特地整理了一个表格做对比 这些模型展示了OpenAI在自然语言处理领域的持续进步&#xff0c;每一代模型都在理解和生成能力、效率和适用性方面进行了显著提升。 网站汇总 这里顺便给大家汇总一下国内同类型的网站&#xff0c;有…

物联网设计竞赛_10_Jetson Nano中文转汉语语音

在windows中pyttsx3可以让汉字文本输出中文语音&#xff0c;但是在jetson上只能用英文说话 import pyttsx3def hanyu(test):engine pyttsx3.init()rate engine.getProperty(rate)engine.setProperty(rate,125)engine.say(test)engine.runAndWait() hanyu(你好) #engine.save…

qt 按钮链接一个槽函数

在Qt中&#xff0c;按钮&#xff08;比如QPushButton&#xff09;可以通过信号和槽的机制来连接到一个槽函数。这样&#xff0c;当按钮被点击时&#xff0c;槽函数就会被执行。下面是如何将一个按钮链接到一个槽函数的基本步骤&#xff1a; 创建按钮和槽函数&#xff1a; 创建…

每日一练全新考试模式解锁|考试升级

&#x1f64b;频繁有小伙伴咨询&#xff1a;我想举办一场历时一个月的答题活动&#xff0c;学生可以每天打开答题&#xff0c;活动完结后可以导出每天的答题成绩 此前我们都会让小伙伴创建30场考试&#xff0c;然后使用批量分享功能组合起来&#xff0c;对外分享一个链接就可以…

【chatgpt消费者偏好】是什么驱动了游客持续旅游意愿?推文分享—2024-07-08

今天推文的主题是【chatgpt&消费者意愿】 第一篇&#xff1a;文章主要研究了什么因素驱动旅游者继续使用ChatGPT进行旅行服务&#xff0c;并从人类拟态的角度探讨了旅游者对ChatGPT的感知和使用意图。第二篇&#xff1a;本文探讨了ChatGPT-4在生成针对TripAdvisor上发布的…

速盾:cdn防御cc

CDN&#xff08;Content Delivery Network&#xff09;是指在分布式网络中分布服务器群&#xff0c;通过就近访问用户、提供快速可靠的内容传输与加速服务。而CC&#xff08;Challenge Collapsar&#xff09;攻击则是一种常见的网络攻击手段&#xff0c;通过发送大量的请求来超…

基于门控循环单元 GRU 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

GEE代码实例教程详解:地形分析

简介 在本篇博客中&#xff0c;我们将使用Google Earth Engine (GEE) 对特定区域内的地形进行分析。我们将使用SRTM&#xff08;Shuttle Radar Topography Mission&#xff09;数据集获取高程信息&#xff0c;并计算坡度、坡向等地形属性。此外&#xff0c;我们还将使用ALOS&a…

# 昇思25天学习打卡营第10天 | 使用静态图加速

昇思25天学习打卡营第10天 | 使用静态图加速 文章目录 昇思25天学习打卡营第10天 | 使用静态图加速动态图的开启方式静态图的开启方式基于全局context的开启方式基于修饰器的开启方式 总结打卡 AI编译框架分为两种运行模式&#xff1a; 动态图模式&#xff1a; 计算图的构建和计…

读人工智能全传07智能体

1. 布鲁克斯革命 1.1. 随着科学认知的发展&#xff0c;有时候旧有科学体系会面临全盘崩溃的危机&#xff0c;新的科学体系诞生&#xff0c;取代传统的、既定的科学体系&#xff0c;这就意味着科学的范式将发生变化 1.2. 澳大利亚机器人学家罗德尼布鲁克斯(Rodney Brooks)&…