Skip to content

LV080-大小端与位操作

一、大小端

  • 大端模式( Big-endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中 。

  • 小端模式( Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中 。

比如: 0x12345678,在大/小端模式的存储位置如下:

c
内存地址 大端模式 小端模式
addr+3   0x78   0x12
addr+2   0x56   0x34
addr+1   0x34   0x56
addr     0x12   0x78

二、位操作

1. 移位

c
int a = 0x6; // 二进制是 0b0110
int b = a<<1;
int c = a>>1;

第 2 行,对 a 左移一位,从 0b0110→0b1100,即 b=0xC 第 3 行,对 a 右移一位,从 0b0110→0b0011,即 b=0x3

2. 取反

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

第 2 行,对 a 按位取反,从 0b0110→0b1001,即 b=0x9

3. 位与

只有对应的两个二进位都为 1 时,结果位才为 1 ,例如

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

int c = a&b;

第 4 行, a&b,二进制是 0b0110,即 c=0x6

4. 位或

只要对应的二个二进位有一个为 1 时,结果位就为 1 ,例如

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

int c = a|b;

第 4 行, a|b,二进制是 0b0111,即 c=0x7

5. 置位

将某一位置1,例如

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

int a |= (1<<3);

第 3 行,将变量 a 的 bit3 置 1。 1<<3 = 0b1000,然后 0b1000|0b0110=0b1110,即 a=0xe

6. 清位

将某一位清0,例如

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

int a &= ~(1<<2);

第 3 行,将变量 a 的 bit2 清位。 ~(1<<2) = 0b1011,然后 0b1011&0b0110=0b0010,即 a=0x2