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时,返回1msg = 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;
}

执行结果:
image

  • 伪函数式接口一般宏定义
    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;
}
posted @ 2020-11-21 22:12  Yanye  阅读(4118)  评论(0)    收藏  举报