这三行C代码究竟做了什么?

时间:2012-02-29 03:59:05

标签: c hash bit-manipulation

我一直试图解析它们几天,我不能完全理解它。他们在这里:

int left = S->buflen >> 3;
int fill = 64 - left;
if(left && (((datalen >> 3) & 0x3F) >= (unsigned)fill)){
   some code here
}

如果有帮助,这是SHA-3候选BLAKE256的参考实现。

2 个答案:

答案 0 :(得分:6)

没有bitops的替代方案可能有助于澄清意义:

int left = S->buflen / 8;
int fill = 64 - left;
if (left != 0) {
    int tmp = datalen / 8;
    if ((tmp % 64) >= (unsigned)fill) {
        /* Some code here */
    }
}

这当然假设buflendatalen是非负的,因为右移运算符对负数具有平台相关行为。

答案 1 :(得分:1)

int left = S->buflen >> 3;

获取剩余的字节数,假设buflen是以位为单位的度量值。

int fill = 64 - left;

获取您需要附加的字节数,以便将其舍入为64的倍数。请注意,如果S->buflen为0,则在不需要时最终会附加整个64字节追加任何,所以......

if(left && (((datalen >> 3) & 0x3F) >= (unsigned)fill)){
   some code here
}

...只有当剩下一些位且datalen从位转换为字节时才执行一些代码,mod 64至少等于你需要写入的额外字节数。大概是因为datalen是最大输出大小?