这个">> ="运算符在C中意味着什么?

Rot*_*m92 19 c

unsigned long set;
/*set is after modified*/
set >>= 1;
Run Code Online (Sandbox Code Playgroud)

我在内核系统调用中发现了这个,但我不明白,它是如何工作的?

Gri*_*han 30

表达式set >>= 1;意味着set = set >> 1;是右移位(set由按位右移运算符检查按位移位运算符的1自分配形式).>>

假设set是:

BIT NUMBER    31   n=27        m=17                 0
              ?    ?           ?                    ?
set =         0000 1111 1111 1110 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

然后set >> = 1;变量set变为:

BIT NUMBER    31   n=26        m=16                 0
              ?     ?           ?                   ?
set =         0000 0111 1111 1111 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

请注意位数已移位.

注意一个有趣的观点:因为setunsigned long所以这个>>操作应该是逻辑移位(无符号移位)逻辑移位不能保持数的符号位.

此外,因为您将所有位向右移动(向较低有效数字移动)所以右移是=将数字除以2.

检查此代码(仅用于演示最后一点):

int main(){
 unsigned long set = 268304384UL;
 set >>= 1;
 printf(" set :%lu \n", set);
 set = 268304384UL;
 set /= 2;
 printf(" set :%lu \n", set);
 return 1; 
}
Run Code Online (Sandbox Code Playgroud)

并输出:

 set :134152192 
 set :134152192
Run Code Online (Sandbox Code Playgroud)

(注意:它不代表>>并且/都相同)

类似地,你有左移的运算符<<=,检查其他可用的按位运算符复合赋值运算符,还检查部分:位表达式和之间的区别:有符号/算术移位和无符号移位.


PP.*_*PP. 10

这个"右移"的价值是一位.如果将整数的所有位向右移动1,则有效地"除以2",因为二进制是基数为2的编号系统.

想象一下你的二进制数是12:

1100 = 12 in binary
 110 =  6 in binary (1100 right-shifted)
Run Code Online (Sandbox Code Playgroud)

就像你将一个基数为10的数字中的所有数字一个一个地移动一样,你将除以10.


Bar*_*mar 6

每个二元运算符都可以与=. 在所有情况下

dest op= expression
Run Code Online (Sandbox Code Playgroud)

相当于

dest = dest op expression
Run Code Online (Sandbox Code Playgroud)

(除非dest有任何副作用,它们只发生一次)。

所以这意味着

set>>=1;
Run Code Online (Sandbox Code Playgroud)

相当于:

set = set >> 1;
Run Code Online (Sandbox Code Playgroud)

由于>>是二元右移运算符,因此表示将值set右移 1 位。