你好,游客 登录 注册 搜索
背景:
阅读新闻

newlisp 模拟C的uint32_t类型 - sheismylife的专栏

[日期:2013-04-06] 来源:  作者: [字体: ]

涉及到算法,经常遇到位操作,而这些位操作都需要固定宽度的整数,比如下面的例子:

void Tea(uint32_t* v, uint32_t* k) {
    uint32_t v0 = v[0], v1 = v[1], sum = 0, i;           /* set up */
    uint32_t delta = 0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];   /* cache key */
    for (i=0; i < 32; i++) {                       /* basic cycle start */
        sum += delta;
        v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
        v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
    }                                              /* end cycle */
    v[0] = v0; v[1] = v1;
    cout << v0 << endl;
    cout << v1 << endl;
}
这是个TEA算法的C语言实现。我们需要unitn32_t类型。

但是newlisp中一般都只有一个Integer类型,它的取值范围在:-9,223,372,036,854,775,808 and +9,223,372,036,854,775,807

这是一个64bit的有符号整数。那么如何将整数限定在uint32_t呢?

我写了一个函数:

(define (u4 v)
  (first (unpack "lu" (pack "lu" v))))

利用pack将整数v转换成uint32的字符串,然后再用unpack将字符串转换成uint32的整数。






收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻