这个功能是做什么的,因为我无法弄清楚它的目的。
int f( int n, int l, int r )
{
return (n << l) >> r;
}
答案 0 :(得分:4)
向左移位n l位,向右移位r位
它有效地乘以2 ^ l然后除以2 ^ r
或换句话说,它会将低阶(l-r)位清零。
答案 1 :(得分:1)
我总是通过用较小的数字进行实验并用二进制思考来解决这些问题。例如。让我们先将它们设为无符号 8位值。让n
为0xFF (255)
,l
为3
,r
为2
。
所以这是两步(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也可能有用。