概述
在单片机实际应用中,操作各种芯片,都是在操作寄存器。有些芯片比较特殊,如:低位在前高位在后,有时通过逻辑分析仪抓到波形又是反向。在编写程序时,每次需要都要换算,觉得非常麻烦,在此借鉴别人的算法进行修改,同时做个笔录,为了以后使用到方便查阅,希望能给广大技术同仁们遇到此问题得到帮助。加油 ^_^
IDE平台: CLion 编写示例
#include <stdio.h>
#include <stdint.h>
#include <mm_malloc.h>
//uint32_t数按位翻转
uint32_t Reverse32Bit(uint32_t x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return ((x >> 16) | (x << 16));
}
//uint16_t数按位翻转
uint16_t Reverse16Bit(uint16_t x) {
#if 0
uint8_t i = 0;
uint16_t data = 0;
for (i=0;i<16;i++)
{
if (x & 0x0001)
{
data |= 0x0001;
}
x >>= 1;
data <<= 1;
}
data >>= 1;
return data;
#else
x = (((x & 0xaaaa) >> 1) | ((x & 0x5555) << 1));
x = (((x & 0xcccc) >> 2) | ((x & 0x3333) << 2));
x = (((x & 0xf0f0) >> 4) | ((x & 0x0f0f) << 4));
x = (((x & 0xff00) >> 8) | ((x & 0x00ff) << 8));
return x;
#endif
}
uint8_t Reverse8Bit(uint8_t x) {
#if 1
uint8_t i = 0;
uint8_t data = 0;
for (i=0;i<8;i++)
{
if (x & 0x01)
{
data |= 0x01;
}
x >>= 1;
data <<= 1;
}
data >>= 1;
return data;
#else
x = (((x & 0xaaaa) >> 1) | ((x & 0x5555) << 1));
x = (((x & 0xcccc) >> 2) | ((x & 0x3333) << 2));
return x;
#endif
}
uint16_t High_low_bit_Change(uint16_t data)
{
uint16_t dataL8, dataH8, resData;
dataL8 = (data & 0x00ff) << 8;
dataH8 = (data & 0xff00) >> 8;
resData = dataL8 | dataH8;
return resData;
}
int main() {
/* 高低位翻转算法 */
uint8_t data8 = 0x02, res_data8;
uint16_t data16 = 0x0002, res_data16;
uint32_t data32 = 0x00000002, res_data32;
uint8_t s8[8], res_s8[8], s16[8], res_s16[16], s32[32], res_s32[32];
res_data8 = Reverse8Bit(data8);
res_data16 = Reverse16Bit(data16);
res_data32 = Reverse32Bit(data32);
itoa(data8, s8, 2);
itoa(res_data8, res_s8, 2);
printf("binary conversion 0x%x: %s, 0x%x: %s\n", data8, s8, res_data8, res_s8);
printf("0x02, 0x%x\n", res_data8);
printf("0x0002, 0x%x\n", res_data16);
printf("0x00000002, 0x%x\n", res_data32);
/************************************************************/
uint16_t data = 0x180c, res;
res = High_low_bit_Change(data);
printf(" 0x%x\n", data);
printf(" 0x%x\n", res);
}
运算结果如下:
总结,有了此算法,以后就方便很多了,如有发现不对的地方请指出,谢谢 ^_^ !