这奇怪的功能是做什么的?

时间:2012-06-26 15:26:24

标签: bit-manipulation

这个功能是做什么的,因为我无法弄清楚它的目的。

int f( int n, int l, int r )  
{  
return (n << l) >> r;  
}  

3 个答案:

答案 0 :(得分:4)

向左移位n l位,向右移位r位

它有效地乘以2 ^ l然后除以2 ^ r

或换句话说,它会将低阶(l-r)位清零。

答案 1 :(得分:1)

我总是通过用较小的数字进行实验并用二进制思考来解决这些问题。例如。让我们先将它们设为无符号 8位值。让n0xFF (255)l3r2

所以这是两步(cha-cha)。第一步,我们向左移l位。

1111 1111b << 3 == 1111 1000b == 0xF8 == 248

然后我们将结果右移r位:

1111 1000b >> 2 == 0011 1110b == 0x3E == 62

现在正如@wildplasser所说,你的值是有符号的,所以你不是在0中移位,而是进行符号扩展。因此,我们假设8位签名值。让n再次为0xFF,将(-1)设为十进制。

左移保持不变,但右移时,符号位将延长。

1111 1111b << 3 == 1111 1000b == 0xF8 == -8
1111 1000b >> 2 == 1111 1110b == 0xFE == -2

所以我不确定该函数的意图是什么,但至少我理解它的作用。如果这是做某事的标准习语,我不知道它是什么。

答案 2 :(得分:0)

@ 8butwide击败了我,但this link也可能有用。