3

我们被分配了对 Linux 内核代码进行一些修改并重新编译它的任务。我很难弄清楚这段代码行是做什么的:

p->time_slice = (current->time_slice + 1) >> 1;

更确切地说,为什么最后有“>> 1”?

4

2 回答 2

7

“>>”表示将值按位向右移动。"x >> y" 与除以 2^y 并截断结果相同。截断结果意味着在几乎所有情况下四舍五入,但是对于负数,可能存在替代实现。如果您认为这发生在您身上,请查看评论。

于 2012-11-12T18:04:44.183 回答
5

这是一个按位移位运算符。将值视为位数组,它将所有内容向右移动一位(向最低有效位)。对于正数,这相当于除以 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 标准没有指定实现必须使用这些解释中的哪一个。GCC 做了更令人期待的一个,符号扩展,这相当于除以二并向下舍入,就像正例一样。请注意,向下舍入意味着“向负无穷大”,而不是您可能假设的“向零”。

-3 >> 1
   1101  ->  1110
               -2
于 2012-11-12T18:05:20.313 回答