高位优先与低位优先

2024-02-05 21:58
文章标签 优先 低位 高位

本文主要是介绍高位优先与低位优先,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Endians是什么意思?它是数据在内存中的排列顺序。在微处理器中,象long/DWORD(32 bits) 0x12345678 这样的数据总是按照高位优先(BIG ENDIAN)方式存放的。但在内存中,数据存放顺序则因微处理器厂商的不同而不同。

数据大小的不同:

Byte:一个字节,标记为byte 0

Word:二个字节,从byte 0到byte 1

Long : 四个字节,从byte 0到byte 3

每个byte由8个位(bit)组成,从bit 7 到 bit 0 (从左往右)。

每个word由16个 bit 组成,从bit 15 到 bit 0 (从左往右)。

每个long由32个 bit 组成,从bit 31 到 bit 0 (从左往右)。

byte 0 是LSB (Less Significant Byte,最低有效字节),byte 3 是MSB (Most Significant Byte,最高有效字节)。因此如果有:

Byte :    3    2    1    0

Number : $12  $34  $56  $78

则值等于:$12*256^3 + $34*256^2 + $56*256^1 + $78*256^0

word类型也一样。word 0 是LSW (Less Significant Word,最低有效字),word 1 是MSW (Most Significant Word,最高有效字):

Word :     1       0

Number : $1234   $5678

值等于:$1234*65536^1 + $5678*65536^0.

字节存放方式:

BIG ENDIAN : 最低地址存放高位字节,可称为高位优先。内存从最低地址开始,顺序存放:

Byte : Byte 3 ($12) (正好是MSB)

Word : Byte 3 到 Byte 2,即word 1 ($1234) (按照从MSB 到 LSB 顺序存放)

Long : Byte 3 到 Byte 0,即word 1 到 word 0 ($12345678) (按照从MSB 到 LSB 顺序存放)

BIG ENDIAN 存放方式正是我们的书写方式,大数先写(比如,总是按照千、百、十、个位来书写数字)。而且所有的处理器都是按照这个顺序存放数据的。

在内存中,根据地址 n (+ 位移量),存放的数据分别是:

n+0 : Byte 3 ($12) (MSB 优先: BIG Endian)

n+1 : Byte 2 ($34)

n+2 : Byte 1 ($56)

n+3 : Byte 0 ($78) (LSB)

Byte 0 的位置是:'n+3' (在 'n+3', byte 0 等于 $78)

Word 0 的位置是:'n+2' ('n+2' 到 'n+3', byte 1 到 byte 0, word 0 等于 $5678)

Long 0 的位置是:'n+0' ('n+0' 到 'n+3', byte 3 到 byte 0, long 0 等于 $12345678)

高位优先方式对于嵌入式系统和调试内存映象都很有用。在寄存器中读到的数据就是内存里的数据。但是如果要在word 0 的地址 'n+2' 处提取低位字(Low Word),就要用附加的内存,通过移位后才能得到,所以会稍慢些。

例如在寄存器中有:$12345678

从地址 'n+0' 开始: $12  $34  $56  $78 (按字节从MSB 到 LSB,即byte 3 到 byte 0)

从地址'n+0' 开始: $1234  $5678 (按字从MSB 到 LSB, 即word 1 到 word 0)

 

BIG ENDIAN 排列顺序还广泛运用在TCP/IP协议上!主要使用BIG Endian 排列结构的是摩托罗拉的 Motorola 6800 系列,68000 系列和ColdFire 系列。PowerPC 是用低位优先(Little Endian)顺序,它是从IBM Power 处理器系列派生而来的。

LITTLE ENDIAN : 最低地址存放低位字节,可称为低位优先。内存从最低地址开始,顺序存放:

Byte : Byte 0 ($78) (正好是 LSB)

Word : Byte 0 到 Byte 1,即 word 0 ($7856) (按照从LSB 到MSB 顺序存放)

Long : Byte 0 到 Byte 3,即 word 0 到 word 1 ($78563412) (按照从LSB 到MSB 顺序存放)

LITTLE ENDIAN 处理器是通过硬件将内存中的LITTLE ENDIAN 排列顺序转换到寄存器的BIG ENDIAN排列顺序的,没有数据加载/存储的开销,不用担心。

在内存中,根据地址 n (+ 位移量),存放的数据分别是:

n+0 : Byte 0 ($78) (LSB 优先:Little Endian)

n+1 : Byte 1 ($56)

n+2 : Byte 2 ($34)

n+3 : Byte 3 ($12) (MSB)

Byte 0 的位置是:'n+3' (在 'n+3', byte 0 等于 $78)

Word 0 的位置是:'n+2' ('n+2' 到 'n+3', byte 1 到 byte 0, word 0 等于 $5678)

Long 0 的位置是:'n+0' ('n+0' 到 'n+3', byte 3 到 byte 0, long 0 等于 $12345678)

Byte 0 的位置是:'n+0' (在 'n+0', byte 0 等于 $78)

Word 0 的位置是:'n+0' ('n+0' 到 'n+1', byte 0 到to byte 1, word 0 等于 $5678,按照 LITTLE ENDIAN 顺序)

Long 0 的位置是:'n+0' ('n+0' 到 'n+3', byte 0 to byte 3, long 0 等于 $12345678,按照 LITTLE ENDIAN 顺序)

低位优先顺序对于要取得诸如LSB或LSW这样的低位数据是很有用的。只要在起始位置上直接提取即可。不过在内存调试时可有些“古怪”。

例如在寄存器中有:$12345678

从地址 'n+0' 开始:$78  $56  $34  $12 (按字节从LSB 到 MSB)

从地址 'n+0' 开始:$7856  $3412 (按字从LSB to MSB)

注意:少数一些处理器是按照LITTLE ENDIAN 排列顺序来进行位运算的,就是说,一个从bit 31 到bit 0 表达的long类型数值按照从bit 0到bit 31的顺序来存放!

寄存器有:   $12345678 (%10010001101000101011001111000)

在地址'n+0':$01CD4589 (%0001110011010100010110001001) (老天,真蠢!)

附件:本文提及的数据格式:

公司:                Motorola     Toshiba          Intel

十进制(Decimal) :       123          123             123 (缺省)

八进制(Octal) :         @173         o173            173o

十六进制(Hexa) :        $7B          h7B             7Bh

二进制(Binary) :      %1111011     b1111011        1111011b

这篇关于高位优先与低位优先的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/682287

相关文章

深度优先遍历C++实现

用c++实现dfs算法,得到二维数组里,从左上角到右下角的所有路径 #include <iostream>#include <vector>using namespace std;void dfs(vector<vector<int>>& matrix, int x, int y, vector<vector<bool>>& visited, vector<int>& path, vector

读者写者问题(读者优先、公平竞争、写者优先)

1.读者优先         当有读者进程进行读时,允许多个读者同时读,但不允许写者写;当有写者进程进行写时,不允许其他写者写,也不允许读者读 读者算法: p(r_mutex); //申请修改read_countif read_count==0:p(mutex); //获得读文件的权限read_count++;V(r_mutex);阅读;//阅读结束p(r_mutex);rea

[AIGC] 宽度优先搜索(BFS) 讲解以及在 LeetCode 题中的应用

宽度优先搜索(Breadth-First Search,简称 BFS)是一种用于图或树结构的遍历算法。它以广度方向进行搜索,首先访问根节点,然后访问所有相邻的节点,然后再通过它们的邻居一直进行下去,直到所有的节点都被访问过。 文章目录 BFS 的工作过程BFS 在 LeetCode 中的应用 BFS 的工作过程 BFS 从图的某一节点(称为“源”节点)开始,访问可能

面试官:请你实现三栏布局并且优先加载中间内容 我:稳啦- ̗̀(๑ᵔ⌔ᵔ๑)

前言 三栏布局是网页设计中一种经典布局方式,它将页面分为三个垂直部分:左栏、中栏和右栏,三栏在同一行显示。 这种布局模式在很多网站的首页或内容密集型页面中非常常见,因为它能够有效地组织信息,提供良好的用户体验。常常也是作为面试常考题出现,今天将为大家介绍常见的三栏布局的方式,其中有些就能实现优先加载中间内容。 如何实现加载中间内容,浏览器在渲染页面的时候是按写的顺序渲染,意思是要想优先加载就

算法之广度优先,深度优先,拓扑,贪心,并查集

文章目录 1 图算法1.1 广度优先搜索1.2 深度优先搜索1.3 拓扑排序1.4 贪心算法1.4.1 定义1.4.2 示例 1.5 并查集(不相交集合数据结构)1.5.1 并查集讲解1.5.2 Kruskal算法1.5.3 Prim算法 1.8 Bellman-Ford算法 1 图算法 地图数据常常可以用图(Graph)这类数据结构表示,那么在图结构中常用的搜索算法也可以应用

PriorityQueue优先队列详解

PriorityQueue优先队列详解 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来详细讲解一下Java中非常重要的数据结构之一——PriorityQueue优先队列。PriorityQueue是Java集合框架中的一部分,用于实现基于优先级的元素排序。它在处理调度任务、路径搜索算法等方面有着广泛的应用。 什么是P

二叉树的先、中、后序遍历的递归和非递归实现及广度优先遍历、深度优先遍历及其高度

// 构造二叉树1/ \2 3/ / \4 5 7\ /6 8 一、二叉树的前、中、后序遍历(递归与非递归实现) 二、二叉树的广度、深度优先遍历 三、求二叉树的高度 import java.util.*;//二叉树的深度和广度遍历public class TreeSearch{//二叉树

JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)

用 js 描述树 let tree = [{label:'a',children:[{label:'b',children:[{label:'d'},{label:'e'}]},{label:'c',children:[{label:'f'}]}]}] 使用数组是因为树的节点有顺序 深度优先遍历 从根节点出发,优先遍历最深的节点 遍历顺序为 abdecf funct

Java实现先来先服务与短作业优先

1、定义作业类 package com.ghs.job;public class Job {/**作业编号*/private String jobId;/**运行时间*/private int runTime;public Job() {super();}public Job(String jobId, int runTime) {super();this.jobId = jobId;this

深度优先遍历-在二叉树中找到两个节点的最近公共祖先

一、问题描述 二、解题思路 使用深度递归的方式,如果当前结点val为o1时,返回1,如果当前结点是val为o2时,返回2; 1.当前结点的左右子树结点返回值分别为1和2时,说明该结点是最近的公共祖先结点 2.当前结点值为o1,左或者右子树返回值为2时,说明o1就是公共祖先结点 3.当前结点值为o2,左或者右子树返回值为1时,说明o2就是公共祖先结点 4.注意,当左