这个“>> =”运算符在C中意味着什么?
unsigned long set; /*set is after modified*/ set >>= 1;
我在内核系统调用中发现了这个,但我不明白,它是如何工作的?
表达式set >>= 1;
表示set = set >> 1;
这是set
为1
右移位(自动分配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
请注意位数已移位。
注意一个有趣的观点:因为set
是unsigned 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