我们已经给了一个任务来对Linux内核代码进行一些修改并重新编译它。 我很难搞清楚这个代码行是做什么的:
p->time_slice = (current->time_slice + 1) >> 1;
更确切地说,为什么最后有“>> 1”?
“>>”表示将值按位向右移动。 “x >> y”与除以2 ^ y并截断结果相同。 截断结果意味着在几乎所有情况下四舍五入,但是负数可能存在替代实现。 如果您认为这发生在您身上,请参阅评论。
这是一个按位移运算符。 作为一个位数组来处理一个值,它把所有的东西都转移到右边(朝着最低有效位)。 这相当于将正数除以2,向下取整。 移动被用作以2的幂分割的快速方式; 如果你移动1( >> 1
),你除以2,如果你移动2( >> 2
),你除以4,依此类推。
例如,下面是几个如何使用4位整数的例子:
6 >> 1 0110 -> 0011 3 7 >> 1 0111 -> 0011 3 6 >> 2 0110 -> 0001 1
对于负数,这有点复杂。 C标准没有指定负数的格式。 在大多数现代机器上,它们都以二进制形式存储; 也就是说,要表示一个负数,则取正表示,反转每一位,并加1.最高有效位用来表示符号位。 如果右移一个负数,则有两种可能的解释。 其中一个总是将0移到最重要的位,其中一个将匹配值转换为已经存在的值,称为“符号扩展”。
-2 >> 1 1110 -> 0111 7 1110 -> 1111 -1
C标准没有指定实现必须使用哪些解释。 海湾合作委员会做更多的预期之一,签名延期,这是相当于除以二和四舍五入,就像正面的情况。 请注意,舍入意味着“趋向负无穷”,而不是像您所假设的那样“趋于零”。
-3 >> 1 1101 -> 1110 -2