C语言的基础操作
- 小端转大端:
0xAABBCCDD经过转换后变成0xDDCCBBAA;这里的操作单元是单个字节,因此转换后位序不会发生改变。
uint32_t a = 0xAABBCCDD;
a = ((a & 0x000000ff) << 24 ) | ((a & 0x0000ff00) << 8) | ((a & 0x00ff0000) >> 8) | ((a & 0xff000000 ) >> 24);
- 按位反转
0x55555555经过转换后变成0xAAAAAAAA。
0x55555555 ^ 0xFFFFFFFF = 0xAAAAAAAA
- 按位逆序
uint32_t swap_bits(uint32_t num) {
// 1bit
num = ((num >> 1) & 0x55555555) | ((num & 0x55555555) << 1);
// 2bit
num = ((num >> 2) & 0x33333333) | ((num & 0x33333333) << 2);
// 4bit
num = ((num >> 4) & 0x0F0F0F0F) | ((num & 0x0F0F0F0F) << 4);
// 8bit
num = ((num >> 8) & 0x00FF00FF) | ((num & 0x00FF00FF) << 8);
// 16bit
num = ((num >> 16) & 0x0000FFFF) | ((num & 0x0000FFFF) << 16);
return (num);
}
- 奇偶校验
校验msg变量(32bit)中1的个数为偶数还是奇数,当msg变量中1的数量为奇数时,返回1;当msg变量中1的数量为偶数数时,返回0。
例如msg = 1时,返回1,msg = 3时,返回0。
uint8_t get_even_par(uint32_t msg)
{
uint32_t n = (msg);
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);
return (uint8_t)(n & 0x1);
}
- 循环左移
0x11223344循环左移16bit后,变成0x33441122。
i = [1, 31]
num = (x >> (32 - i)) | (x << i);
// 循环右移同理
- ASCII大写转小写
res = ch | 0x20; // (ch | ' ');
- c语言(伪)实现Lambda
注意:仅在GCC编译器做过测试,ARMCC请自行测试。
typedef uint8_t (* done_callback_t)(uint8_t var);
static done_callback_t callback;
void set_done_callback(done_callback_t t) {
callback = t;
}
void test() {
uint8_t val = callback(8);
printf("val = %d\n", val);
}
int main(int argc, char **argv) {
set_done_callback(({uint8_t template(uint8_t a) {
return a + 100;
}template;}));
test();
return 0;
}
执行结果:

- 伪函数式接口一般宏定义
funcname需要自行更改以防重复
#define FunInterface(ret_t, funbody) \
({ret_t funcname funbody funcname;})
精简的CRC32算法
来自LittleFS,较小的查找表(rtable)且计算速度不错。
uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size) {
const uint32_t rtable[16] = {
0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c,
};
const uint8_t *data = buffer;
for (size_t i = 0; i < size; i++) {
crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 0)) & 0xf];
crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 4)) & 0xf];
}
return crc;
}

浙公网安备 33010602011771号