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

Ake*_*eel 6 c

反转具有不同大小的不同成员的结构的所有位的有效方法是什么?

示例结构:

typedef struct {
    uint16_t mem1;
    uint8_t mem2;
    uint32_t mem3;
    uint8_t mem4[4];
} sample_struct;
Run Code Online (Sandbox Code Playgroud)

chq*_*lie 11

一种简单而通用的方法是使用这样的函数:

void *memxor(void *p, int val, size_t size) {
    unsigned char *pb = p;
    while (size-- > 0) *pb++ ^= (unsigned char)val;
    return p;
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它:

sample_struct s;
...
memxor(&s, ~0, sizeof s);
Run Code Online (Sandbox Code Playgroud)

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

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

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