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

比较C中具有任意位数的两个值,c,casting,function-pointers,C,Casting,Function Pointers,我在C中创建了一个动态键入系统,以便创建一个可以包含不同位宽度值的字典。动态对象的结构是: typedef struct { void* Pointer; unsigned char Size; } Dynamic; 我需要比较两个保持2D读数的动力学,然后将差值与增量值进行比较,以确定是否发生了变化。我能想到的一个解决方案是将它们转换为字符数组,并逐字节比较它们,但这听起来不太对劲。我还有一个想法,就是根据动态占用的字节数(或者可能是类型)生成一个函数指针数组,并为支持

我在C中创建了一个动态键入系统,以便创建一个可以包含不同位宽度值的字典。动态对象的结构是:

typedef struct
{
    void* Pointer;
    unsigned char Size;   
} Dynamic;
我需要比较两个保持2D读数的动力学,然后将差值与增量值进行比较,以确定是否发生了变化。我能想到的一个解决方案是将它们转换为字符数组,并逐字节比较它们,但这听起来不太对劲。我还有一个想法,就是根据动态占用的字节数(或者可能是类型)生成一个函数指针数组,并为支持的每种类型生成一个比较函数。有人能提出不同的方法吗?感觉好像我错过了什么

更新:

谢谢你告诉我关于memcmp的事,但我仍然有一个问题,那就是如何得到这两个值的增量?据我所知,memcmp只返回哪个值更大的指示器,而不是它们之间的差异

更新到更新:

事实证明,memcmp对我来说是无用的,因为我编译的体系结构是LittleEndian


如果我要自己做一个bignum实现,那么ephemient感觉是正确的方法,但是我决定我要将值memcpy到我必须处理的最大可能类型(即unsigned long-long)中,并使用它们进行计算。我想不出为什么这不起作用,但我承认我可能大错特错,因为C/直接内存操作不是我的强项。

听着,我知道我是个数学怪人,但基本问题听起来像“天啊,这些东西的自然顺序是什么?”


底层数据是原始位吗,比如Bignum?然后将它们强制转换为无符号字符,并在循环中进行比较。稍微考虑一下你比较的顺序会使它最有效。有趣的一点是,当≠ B的长度:是A≠B那么根据定义,或者是您正在比较的数值,在这种情况下,0x00的前导字节并不重要?

听着,我知道,我是一个数学怪人,但基本问题听起来像“哎呀,这些东西的自然顺序是什么?”


底层数据是原始位吗,比如Bignum?然后将它们强制转换为无符号字符,并在循环中进行比较。稍微考虑一下你比较的顺序会使它最有效。有趣的一点是,当≠ B的长度:是A≠B那么根据定义,或者是您正在比较的数值,在这种情况下,前导字节0x00并不重要?

如果您只需要进行相等性比较,请使用memcmp()。如果您需要计算有多少位(或字节)不同,请实现一个类似于memcmp()的函数,该函数在两个字符数组中运行,比较并计算不匹配的模式。

如果您只需要比较是否相等,请使用memcmp()。如果需要计算有多少位(或字节)不同,请实现一个类似于memcmp()的函数,该函数在两个字符数组中运行,比较并计算不匹配的模式。

这样就足够了吗

#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比较(动态*a,动态*b){
如果(a->Size!=b->Size)返回a->Size-b->Size;
返回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;
    }
}
int-diff(动态*a、动态*b、动态*d){
int i,借用=0;
有符号字符*ap=a->指针,*bp=b->指针,*dp=d->指针;
断言(a->Size==b->Size&&b->Size==d->Size);
对于(i=0;iSize;ap++,bp++,dp++,i++){
//对称差分
*dp=*ap^*bp;
//算术差,假设小端点
*dp=借款+=*bp-*ap;
借款>>=8;
}
}

这样就足够了吗

#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比较(动态*a,动态*b){
如果(a->Size!=b->Size)返回a->Size-b->Size;
返回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;
    }
}
int-diff(动态*a、动态*b、动态*d){
int i,借用=0;
有符号字符*ap=a->指针,*bp=b->指针,*dp=d->指针;
断言(a->Size==b->Size&&b->Size==d->Size);
对于(i=0;iSize;ap++,bp++,dp++,i++){
//对称差分
*dp=*ap^*bp;
//算术差,假设小端点
*dp=借款+=*bp-*ap;
借款>>=8;
}
}

也许我也遗漏了一些东西……但为什么不使用memcmp呢

也许我也遗漏了一些东西……但你为什么不使用memcmp呢

我假定可变位大小是由于某些值大于其他值。如果可以保证位数始终意味着设置了位数,则可以首先比较大小,如果大小相等,则进行无符号字节比较。例如,“01”只需要存储1位,因此其大小为1,“100101”需要存储6位,因此其大小为6。如果尺寸(a)>尺寸(b),则(a)>尺寸(b)


这些数据是以大端还是小端存储的?

我认为可变位大小是由于某些值比其他值大。如果可以保证位数始终意味着设置了位数,则可以首先比较大小,如果大小相等,则进行无符号字节比较。例如,“01”只需要存储1位,因此其大小为1,“100101”需要存储6位,因此其大小为6。如果尺寸(a)>尺寸(b),则(a)>尺寸(b)


这些存储在大或小字节中吗?

< P>如果你试图实现BigNIM功能(你可能会考虑)(首先是谷歌HIT)