繁体   English   中英

比较两个C中具有任意位数的值

[英]Compare two values that have an arbitrary number of bits in C

我已经在C语言中创建了一个动态类型系统,以便创建一个可以包含不同位宽值的字典。 动态对象的结构为:

typedef struct
{
    void* Pointer;
    unsigned char Size;   
} Dynamic;

我需要比较其中两个保存A2D读数的动力学,然后将差异与增量值进行比较,以确定是否发生了更改。 我想出的一种解决方案是将它们转换为char数组,并逐字节比较它们,但这听起来不对。 我也有一个想法,可以根据Dynamics占用的字节数(或类型)创建一个函数指针数组,并为每种受支持的类型制作一个比较函数。 有人可以建议其他方法吗? 感觉好像我缺少什么。

更新:

感谢您告诉我有关memcmp的信息,但仍然存在如何获取两个值的差值的问题? 据我所知,memcmp只是返回一个指示值较大的指标,而不是两者之间的差异。

更新到更新:

事实证明,memcmp对我来说是没有用的,因为我要编译的体系结构很少字节序。

如果我要自己执行一个bignum实现,那么短暂的感觉就像是正确的方法,但是我决定将这些值存储为必须处理的最大可能类型(即长无符号)。并使用它们进行数学运算。 我想不出为什么它不起作用的任何原因,但我认识到我可能很错,因为C /直接内存操作不是我的专长。

这样够了吗?

#include <string.h>
int compare(Dynamic *a, Dynamic *b) {
    if (a->Size != b->Size) return a->Size - b->Size;
    return memcmp(a->Pointer, b->Pointer, a->Size);
}

如果它们执行非常相似的操作,则创建一堆专门的功能似乎有点过头了。

附录

如果要计算差异...

int diff(Dynamic *a, Dynamic *b, Dynamic *d) {
    int i, borrow = 0;
    signed char *ap = a->Pointer, *bp = b->Pointer, *dp = d->Pointer;

    assert(a->Size == b->Size && b->Size == d->Size);

    for (i = 0; i < a->Size; ap++, bp++, dp++, i++) {
        // symmetric difference
        *dp = *ap ^ *bp;

        // arithmetic difference, assuming little-endian
        *dp = borrow += *bp - *ap;
        borrow >>= 8;
    }
}

也许我也缺少一些东西...但是为什么不使用memcmp呢?

如果您要尝试实现bignum功能(并且您可能会考虑其他人的功能 (第一个google点击“ bignum in C”)),则几乎可以肯定要通过减法计算出差异。 大多数CPU仅通过执行此操作,然后对<,>或==使用结果的符号或零值来实现比较。

你看,我是一个数学怪才,我知道,但潜在的问题听起来像“哎呀,什么这些东西的自然排序?”

基础数据原始位是否像Bignum一样? 然后将它们转换为未签名的char并在循环中进行比较。 稍微考虑一下比较顺序将使其最有效。 有趣的一点是,当A的长度≠B的长度:是A≠B然后是定义时,还是它是您要比较的数值,在这种情况下,前导字节0x00并不重要?

如果只需要比较相等性,请使用memcmp()。 如果需要计算多少位(或字节)不同,请执行与memcmp()类似的函数,该函数在两个char数组中均运行,比较并计算不匹配的模式。

我认为可变位大小是由于某些值大于其他值。 如果可以保证位数始终表示已设置位数,则可以先比较大小,如果大小相等,则进行无符号字节比较。 例如,“ 01”仅需要存储1位,因此其大小将为1,而“ 100101”需要6位存储,因此其大小为6。如果size(a)> size(b),则(a)> (b)中。

这些存储在大端或小端中吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM