-1

我想从另一个 16 位无符号整数列表中推导出一个 16 位无符号整数列表。

例如,给定列表:

10000, 12349, 32333, 3342

我知道另一个列表的第一个整数是 0,现在我想推导出其余的。映射是从它们中减去 10000,我得到了

0, 2349, 22333, 58878

其中 58878 = (3342-10000+65536) 模 65536 作为包装的结果。

伪代码是这样的:</p>

 void deduce(u_int16_t list1[100], u_int16_t *list2[100], u_int16_t first)
 {
      int diff = first - list1[0];
      for (i = 0; i < 100; i++)
          (*list2)[i] = (list1[i] + diff + 65536) % 65536;
 }

但我们知道无符号整数中没有负数。

那么如何进行映射(或演绎)?

谢谢!

4

3 回答 3

2

无符号整数变量可以减去比它们包含的更多 - 如果我正确理解这个问题。

u_int16_t u = 10;
u -= 20; // => u = u - 20;
printf("%x, %u\n", u, u); // => fff6, 65526

不同的是

  • 显示时,u不显示负值 - 即 MSb(最高有效位,即第 15 位)被解释为(此处)为 2 15,下一个为 2 14等...
  • 当扩展(例如到 32 位)时,MBb 不会从第 16 位传播到第 31 位(因为它们会在有符号时) - 它们是0
  • 右移时,值 MSb 总是0(如果有符号,将与前一个 MSb 相同,例如1对于负值)

因此,您的映射将继续使用u_int16_t(如果您在任何地方使用该类型,则不需要%模 65536,因为无论如何这些值都是 16 位 - 模是隐式的)。

于 2013-06-10T15:35:53.540 回答
1
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

void deduce(uint16_t list1[], uint16_t list2[], size_t size){
    int32_t i, first = list1[0];

    for(i=0;i<size;++i){
    //  list2[i]= list1[i] - first;
        int32_t wk = list1[i];
        wk -= first;
        if(wk<0)
            wk += 65536;
        list2[i] = wk;
    }
}

int main(void){
    uint16_t list1[100] = {
        10000,
        12349,
        32333,
         3342
    };
    uint16_t list2[100];
    int i;

    deduce(list1, list2, 4);
    for(i = 0; i<4; ++i)
        printf("%5" PRIu16 "\n", list2[i]);

    return 0;
}
于 2013-06-10T14:41:44.077 回答
0

我不太明白你的问题,但如果你想要的是将第一个列表的每个元素减去两个列表的第一个元素之间的差异。这段代码应该可以工作。

void deduce(uint16_t list1[], uint16_t list2[], int size)
{
    uint16_t diff = list1[0] - list2[0];
    int i;
    for (i=0; i<size; i++)
        list2[i] = list1[i] - diff;
}

您不需要将 list2 作为 u_int16_t* list2[] 传递,因为您实际上可以使用 u_int16_t list2[] 编辑数组的内容。如果要在此函数中进行动态内存分配,请仅使用 u_int16_t* list2[]。

于 2013-06-10T14:43:48.120 回答