我们被分配了对 Linux 内核代码进行一些修改并重新编译它的任务。我很难弄清楚这段代码行是做什么的:
p->time_slice = (current->time_slice + 1) >> 1;
更确切地说,为什么最后有“>> 1”?
我们被分配了对 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 标准没有指定实现必须使用这些解释中的哪一个。GCC 做了更令人期待的一个,符号扩展,这相当于除以二并向下舍入,就像正例一样。请注意,向下舍入意味着“向负无穷大”,而不是您可能假设的“向零”。
-3 >> 1
1101 -> 1110
-2