大端小端和位运算

一.大端小端含义和判断

大端模式:按照高字节存低地址,低字节存高地址,先访问高地址。

小端字节序: 按照低字节存低地址,高字节存高地址,先访问低地址。

1.如何判断平台是小端还是大端?

分析:一个char字符一个字节,一个short 两个字节;

    char s[2] = {0, 1};
    unsigned short *ret = (unsigned short *)(s);
    printf("ret:%d\n", *ret);

因为我们已经给出s[2],并且已经确定了这两个字节在内存中的存储顺序就是:

相对的地址:  (低地址)    0x00 0x01        0x02 0x03      高地址

字节序                             【0000 0000】【0000 0001】

小端模式下,内存中从低位开始读,转换为二进制就是:

0000 0001 0000 0000

表示为十进制就是256

大端模式下,内存中从高地址开始读,转换为二进制就是: 

0000 0000 0000 0001

表示十进制就是1

读出来的数据转换为二进制时,低位放在右边,高位放在左边,初学者很容易混淆比如我。

二.位运算 

这里假设有unsigned int 值 num,转换为二进制为:

num 二进制:0100 0001 1000 0010 0011 1000 1000 0101  

操作 :num>>16       

num 转换后:0000 0000 0000 0000 0100 0001 1000 0010

操作: num<<16

num转换后: 0011 1000 1000 0101 0000 0000 0000 0000

按位与 &

  • 当两个对应的位都为 1 时,结果为 1;否则结果为 0

按位或 |

 

  • 当至少有一个相应位为 1 时,结果为 1;当两个位都为 0 时,结果为 0

举例:

    unsigned int tmp;
    fread(&tmp, 1, 3, fp);
    *u24 = (((tmp >> 16) & 0xFF) | ((tmp << 16) & 0xFF0000) | (tmp & 0xFF00));

 从文件中读取的3个字节,tmp中多余的高位字节被0填充;

(tmp >>16) 留下了高 8 位

(tmp <<16)留下了低 8 位变成了高 8 位

为什么要& 0xFF 0xFF0000 0xFF00 ,这是为了确保,当tmp不符合预期或者数据源中的内容无效的时候,确保操作的结果符合我们期望的格式。

这个操作是将高8位和低8位互换,一般用于3个字节的小端字节序转换到大端字节序。

 

你可能感兴趣的:(ffmpeg学习,数据结构)