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

pg1*_*989 0 c hash bit-manipulation

我一直试图解析它们几天,我不能理解它.他们来了:

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

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

Ada*_*cin 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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

这当然假设buflen并且datalen是非负的,因为右移运算符具有负数的平台相关行为.