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

unsigned long set; /*set is after modified*/ set >>= 1; 

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

表达式set >>= 1; 表示set = set >> 1; 这是set1右移位(自动分配forms的>>按位右移运算符检查按位移位运算符 )。

假设如果set为:

 BIT NUMBER 31 n=27 m=17 0 ▼ ▼ ▼ ▼ set = 0000 1111 1111 1110 0000 0000 0000 0000 

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

 BIT NUMBER 31 n=26 m=16 0 ▼ ▼ ▼ ▼ set = 0000 0111 1111 1111 0000 0000 0000 0000 

请注意位数已移位。

注意一个有趣的观点:因为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; } 

并输出:

  set :134152192 set :134152192 

(注意:它不代表>>/都是一样的)

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

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

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

 1100 = 12 in binary 110 = 6 in binary (1100 right-shifted) 

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

这会将位向右移位1,相当于除以2.有关位移的更多信息,请参阅http://msdn.microsoft.com/en-us/library/f96c63ed(v=vs.80)。 ASPX

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

 dest op= expression 

相当于

 dest = dest op expression 

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

所以这意味着

 set>>=1; 

相当于:

 set = set >> 1; 

由于>>是二进制右移运算符,它意味着set右侧的值移位1位。

上面的命令执行右移一位。从此链接中查看 c中的位操作http://www.cprogramming.com/tutorial/bitwise_operators.html