linux内核代码">>"运算符

bks*_*bks 3 c linux operating-system linux-kernel

我们已经获得了对Linux内核代码进行一些修改并重新编译的任务.我很难搞清楚这段代码行的作用:

p->time_slice = (current->time_slice + 1) >> 1;
Run Code Online (Sandbox Code Playgroud)

更准确地说,为什么最后有">> 1"?

dbe*_*eer 7

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

  • @ H2CO3:它不是*与截断相同; 它相当于正值的截断和负值的实现定义(大多数常见的实现都会将负值向下舍入). (4认同)
  • *除以2并截断结果. (2认同)

Bri*_*ell 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
Run Code Online (Sandbox Code Playgroud)

对于负数,它有点复杂.C标准没有规定负数的格式.在大多数现代机器上,它们以两个补码存储; 也就是说,为了表示负数,您采用正表示,反转每一位,然后加1.最高有效位然后用来表示符号位.如果你右移一个负数,有两种可能的解释; 在这种情况下,您总是将0移到最重要的位,其中一位将匹配值移位到已存在的位,称为"符号扩展".

-2 >> 1
   1110  ->  0111
                7
   1110  ->  1111
               -1
Run Code Online (Sandbox Code Playgroud)

C标准没有规定实现必须使用哪些解释.海湾合作委员会做了更加预期的一个,即延长标志,这是除以2和四舍五入的公平,就像积极的情况一样.请注意,向下舍入表示"朝向负无穷大",而不是"假向零".

-3 >> 1
   1101  ->  1110
               -2
Run Code Online (Sandbox Code Playgroud)