字节序和位操作
文章目录
- 一、字节序
- 二、位操作
- 2.1.位移
- 2.1.1.左位移
- 2.1.2.右位移
- 2.2.取反
- 2.3.位与
- 2.4.位或
- 2.5.置位
- 2.5.清除
一、字节序
例如一个变量:int a = 0x12345678,每两个数为一个 byte,这个值有 4 个 byte,将它存放在内存里需要 4 个 byte,12 是高位,78 是低位,它的存储方式有两种:
- 小字节序,little endian:低位数据存放在低地址,高位数据存放在高地址
- 大字节序,big endian:高位数据存放在低地址,低位数据存放在高地址
二、位操作
2.1.位移
2.1.1.左位移
例如一个变量 int a = 0x123,左移 2 位:
0x123 = 0001 0010 0011
左移两位后:
0x123 << 2 = 0x48C
0100 1000 1100 = 0x48C
2.1.2.右位移
例如一个变量 int a = 0x123,右移 2 位:
0x123 = 0001 0010 0011
左移两位后:
0x123 >> 2 = 0x48
0000 0100 1000 = 0x48
2.2.取反
例如一个变量 int a = 0x123,int b = ~a:
0x 0000 0123 = 0000 0000 0000 0000 0000 0001 0010 0011
取反之后:
1111 1111 1111 1111 1111 1110 1101 1100 = 0x FFFF FEDC
2.3.位与
两数相与,相当于数学里的乘法,有 0 就为 0:
a | b | c |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
int a = 0x123;
int b = 0x456;
int c = a & b;
0x123 = 0001 0010 0011
0x456 = 0100 0101 0110
c = 0000 0000 0010 = 0x2
2.4.位或
两数相或,相当于数学里的加法,有 1 就为 1:
a | b | c |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
int a = 0x123;
int b = 0x456;
int c = a | b;
0x123 = 0001 0010 0011
0x456 = 0100 0101 0110
c = 0101 0111 0111 = 0x577
2.5.置位
将某一位置 1,例如:将变量 int a = 0x123 里的 7、8 位置 1:
int b = a | (1 << 7) | (1 << 8);
0x123 = 0001 0010 0011
(1 << 7) = 0000 1000 0000 //从最低位为0开始数7个位
(1 << 8) = 0001 0000 0000 //从最低位为0开始数8个位
b = 0001 1010 0011 = 0x1A3
2.5.清除
将某一位置 0,例如:将变量 int a = 0x123 里的 7、8 位置 0:
int b = a & ~(1 << 7) & ~(1 << 8);
0x123 = 0001 0010 0011
~(1 << 7) = 1111 0111 1111 //从最低位为0开始数7个位
~(1 << 8) = 1110 1111 1111 //从最低位为0开始数8个位
b = 0000 0010 0011 = 0x23