我正在开展一个项目,我希望在16位字上实现一些位移。
具体来说,我希望将8个最低有效位转换为8个最高有效位,反之亦然。
请注意,我没有反转或旋转这些位,正如之前的Stackflow问题中可能已经提到的那样。
例如,如果我有以下16位字:
0000 0000 0010 0110
我想执行某种按位或算术运算将其转换为:
0010 0110 0000 0000
本质上,最低有效8位交换位置具有最高有效8位。
BTW - 重要的是,我正在处理这些16位字的2个补码二进制值。
有关如何执行此操作的任何想法?
所有的想法都赞赏。 THX。
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以应用模数和整数除法:
x = x % 256 * 256 + x / 256;
答案 2 :(得分:0)
步骤1,使用无符号类型。
步骤2:让编译器优化代码。
unsigned swap2bytes(unsigned x) {
// LSB-->MSB MSB-->LSB Mask-off any higher order bits
return ((x * 256) + ((x / 256) % 256)) & 0xFFFFFFFF;
}
适用于任何规模的unsigned
。
固定宽度方法:
int16_t swap2bytes(int16_t x) {
return x * 256u + x / 256u;
}