在C中反转结构中的所有位

前端之家收集整理的这篇文章主要介绍了在C中反转结构中的所有位前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
反转具有不同大小的不同成员的结构的所有位的有效方法是什么?

示例结构:

typedef struct {
    uint16_t mem1;
    uint8_t mem2;
    uint32_t mem3;
    uint8_t mem4[4];
} sample_struct;

解决方法

一种简单而通用的方法是使用这样的函数
void *memxor(void *p,int val,size_t size) {
    unsigned char *pb = p;
    while (size-- > 0) *pb++ ^= (unsigned char)val;
    return p;
}

并以这种方式使用它:

sample_struct s;
...
memxor(&s,~0,sizeof s);

如果由于某种原因,您想要优化更多,请尝试以下方法

void meminvert(void *ptr,size_t size) {
    if (((uinptr_t)ptr | size) & (sizeof(unsigned int) - 1)) {
        unsigned char *p = ptr,*pe = pb + size;
        while (p < pe) *p++ ^= ~0U;
    } else {
        unsigned int *p = ptr,*pe = p + size / sizeof *p;
        while (p < pe) *p++ ^= ~0U;
   }
}

如果优化版本确实有所作为,您可以尝试进行基准测试.它需要一个庞大的结构和一个不合理的呼叫数量.像这样的优化很少需要并且经常是错误的.

猜你在找的C&C++相关文章