C:按位非结构体

标签 c struct bit-manipulation

Possible Duplicate:
How do you compare structs for equality in C?

在宏中,我需要作为该宏的参数的变量或结构的按位非。

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

这对于变量来说工作得很好,但是对于结构来说就不行了。有人知道在宏中获取结构体按位非的简单方法吗?

编辑:

抱歉我问这个问题太快了。我必须确保某些变量在 RAM 中保存两次 - 正态和逆态(由于某些规定)。我们构建了一些宏来帮助我们处理普通变量。

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

最佳答案

没有直接的方法可以在一次操作中获得整个结构的“按位非”。您可能需要对结构进行逐成员评估,除非您编写了类似于 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)))

如果这被证明是瓶颈,您可以考虑优化。例如,如果长度是 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> 的 future 方向)。

Function names that begin with str, mem, or wcs and a lowercase letter may be added to the declarations in the header.

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

关于C:按位非结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7832312/

相关文章:

json - 如何读取结构字段 ` ` 装饰器?

c - 判断 32 位有符号整数是否为 2 的幂

c - 矩阵嵌套在另一个矩阵中

c - 与使用该语言的标准操作相比,用 C 语言对数字电路进行建模是否有任何实际好处?

c - 了解结构中的指针行为

swift - 如何向扩展添加另一个级别(像扩展一样分类)

c - 在同一语句中向左和向右按位移位

c++ - 当您将位移超出变量的末尾时会发生什么?

c - 尝试从命令行获取星号 * 作为对 main 的输入

c - 这两个 C 声明之间有什么区别?