高位优先与低位优先

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

相关文章

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

堆-数组的堆化+优先队列(PriorityQueue)的使用

一、堆 1、什么是堆? 以完全二叉树的形式将元素存储到对应的数组位置上所形成的新数组 2、为什么要将数组变成堆? 当数组中的元素连续多次进行排序时会消耗大量的时间,将数组变成堆后通过堆排序的方式将会消耗更少的时间 二、接口 给堆定义一个接口,用来规范堆里面的方法 1、在获取堆顶元素和删除堆顶元素的方法中,都必须返回堆顶元素,当堆为空时,返回异常对象要比返回null关键字更加安全 定

优先队列与堆排序

PriorityQueue 优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索。无论何时调用remove方法,总会获得当前优先级队列中的最小元素(其实是返回堆顶元素),但并不是对所有元素都排序。它是采用了堆(一个可以自我调整的二叉树),执行增加删除操作后,可以让最小元素移动到根。 堆排序复习 package com.jefflee;import java.util.Arr

Add All -uva优先队列的应用

题目的解法属于贪心,因为cost=a1+a2,所以要保证每次的cost最小,所以说,每次将队列中最小的两个相加,得出来的数放入队列中,再取2个最小的相加,直到全部加完,所以这就涉及了一个取2个最小数的问题,我说一下我一开始的做法 #include<stdio.h>#include<iostream>#include<stdlib.h>using namespace std;#define

2431Expedition POJ- 优先队列 + 贪心

该题需要注意的问题 题目给的加油站是到目的地的距离而不是距离起始点的距离 贪心策略,每次耗尽当前所有油,找路过所有加油站的能添加最大油量的那一家,加油,之后再走,在这个过程中不断将沿途经过的加油站添加到队列 #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue

【CF】C. Glass Carving(二分 + 树状数组 + 优先队列 + 数组计数)

这题简直蛋疼死。。。。。 A了一下午 #include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn = 200005;int h,w,n;int C1[maxn],C2[maxn];int