概述
在单片机实际应用中,操作各种芯片,都是在操作寄存器。有些芯片比较特殊,如:低位在前高位在后,有时通过逻辑分析仪抓到波形又是反向。在编写程序时,每次需要都要换算,觉得非常麻烦,在此借鉴别人的算法进行修改,同时做个笔录,为了以后使用到方便查阅,希望能给广大技术同仁们遇到此问题得到帮助。加油 ^_^
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 0uint8_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;
#elsex = (((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 1uint8_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;
#elsex = (((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);}
运算结果如下:
总结,有了此算法,以后就方便很多了,如有发现不对的地方请指出,谢谢 ^_^ !