C:按位而不是结构

时间:2011-10-20 07:07:31

标签: c struct bit-manipulation

  

可能重复:
  How do you compare structs for equality in C?

在宏中,我需要按位而不是变量或结构,这是该宏的参数。

 #define THE_C_MACRO(var) (someFunction(~var == var##_inv))

使用变量可以正常工作,但结构不起作用。有人知道一个简单的方法来获取宏中的结构而不是结构吗?

编辑:

对不起我问这个问题太快了。我必须确保一些变量在RAM中保存两次 - 正常和反向(由于某些规定)。我们构建了一些宏来帮助我们处理正常的变量。

我想把它扩展到结构。但也没有简单的方法来比较两个结构=>这不会那么容易。

1 个答案:

答案 0 :(得分:2)

在一次操作中没有直接的方法来获得整个结构的“按位”。您可能需要对结构进行成员评估,除非您编写了类似于memset()的函数:

void memnot(void *data, size_t length)
{
    unsigned char *src = (unsigned char *)data;
    while (length-- > 0)
        *src = ~*src;
}

您的宏需要是以下之一:

#define BITWISE_INVERT_STRUCT(x)     memnot(&(x), sizeof(x))
#define BITWISE_INVERT_STRUCTPTR(x)  memnot(x, sizeof(*(x)))

如果这被证明是瓶颈,您可以考虑优化。例如,如果length是8个字节的倍数,则在uint64_t上使用循环;如果它是4个字节的倍数,则在uint32_t上使用循环;如果它是2个字节的倍数,则在uint16_t上使用循环;否则使用此处显示的内容。这使得可能的激进假设是,如果结构是8字节长的倍数,则有效结构地址也将是8字节的倍数。情况不一定如此;诸如struct irksome { uint16_t a, b, c, d; };之类的结构即使长度为8个字节也只需要2个字节的对齐。您可以对地址和大小进行其他更仔细/细微的分析,并决定是按字节顺序还是以更大的倍数进行操作。

名称memnot()保留给实施(C99§7.26.11 - <string.h>的未来方向)。

  

可以添加以str,mem或wcs开头的函数名称和小写字母   到标题中的声明。

您可能更喜欢使用mem_not()memNot()或其他内容作为函数名称。