簡體   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