【发布时间】:2020-03-16 12:02:51
【问题描述】:
我正在尝试反转我的压力数据值并将此反转结果存储在整数 uint16_t Pcounts 中。我找到了一个可以使用的宏,它似乎翻转了一些位,但没有翻转其他位。这是我的代码:
#define REV(X) ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))
uint16_t PressureData;
uint16_t Pcounts;
Pcounts = REV(PressureData);
如果 PressureData = 0xAABB,我希望 Pcounts 为 0xBBAA。但是,结果是 0xBB00。
PressureData 是从传感器检测到的实时压力值。
【问题讨论】:
-
为什么要移动 16 位和 24 位? 16 位值没有那么高的位。
-
@Someprogrammerdude 好地方!宏应该是:#define REV(X) ((X >16)>16) | (((X>8) >8))
-
该宏用于反转 32 位
unsigned整数中的四个 8 位字节。不应该期望它使用 16 位或有符号整数。对于 16 位,您可以使用#define Rev16(x) ((x) >> 8 | (x) << 8),假设参数是一个 16 位无符号整数并且结果被立即分配或强制转换为一个 16 位无符号整数。 (如果不是,则需要屏蔽。) -
如果您的系统是 little-endian 并且您使用 big-endian 存储,那么您正在执行标准转换 - 从特定于主机的字节顺序更改为 network byte order。这通常是为了便携性。这很常见,POSIX 定义了为您执行此操作的函数:
htons()会将uint16_t从主机字节顺序转换为网络字节顺序,ntohs()将采用网络(大端)uint16_t并将其转换为当前主机字节顺序。