位序
描述数值在内存中的每一个位排列顺序。
举例说明,以一个8位字节为例,数值0x0A的小端和大端描述如下:
1. 小端位序为
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
数值 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
2. 大端位序为
位 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
数值 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
或者描述为
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
数值 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
飞腾CPU位序
飞腾CPU采用小端位序。以数值0x0A经过逻辑移位来看
1. LSL逻辑左移3位可以获得0x60
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
数值 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
1. LSR逻辑右移3位可以获得0x01
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
数值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
飞腾CPU的位序转换指令
飞腾CPU提供一个32位和64位的位序转换指令RBIT,具体操作如下
RBIT <Wd>, <Wn> //32位位序转换
RBIT <Xd>, <Xn> //64位位序转换
基于上述指令可以实现8位,16位,32位和64位转换的C语言函数
inline __atrribute_const__ __u8 rbit8(__u8 x)
{
__asm__("rbit %w0, %w1\n" "lsr %w1, %w1, #24":"=r"(x):"r"(x));
return x;
}
inline __atrribute_const__ __u16 rbit16(__u16 x)
{
__asm__("rbit %w0, %w1\n" "lsr %w1, %w1, #16":"=r"(x):"r"(x));
return x;
}
inline __atrribute_const__ __u32 rbit32(__u32 x)
{
__asm__("rbit %w0, %w1":"=r"(x):"r"(x));
return x;
}
inline __atrribute_const__ __u64 rbit64(__u64 x)
{
__asm__("rbit %x0, %x1":"=r"(x):"r"(x));
return x;
}