unsigned long set;
/*set is after modified*/
set >>= 1;
我在内核系统调用中发现了这个,但我不明白它是如何工作的?
unsigned long set;
/*set is after modified*/
set >>= 1;
我在内核系统调用中发现了这个,但我不明白它是如何工作的?
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
执行 set >> = 1;
后,变量set
变成:
BIT NUMBER 31 n=26 m=16 0
▼ ▼ ▼ ▼
set = 0000 0111 1111 1111 0000 0000 0000 0000
注意移位的比特数。
请注意一个有趣的点:因为set
是unsigned long
,所以这个>>
操作应该是逻辑移位(无符号移位)。逻辑移位不保留数字的符号位。
此外,因为你将所有位都向右移(朝着较低的有效数字),所以一个右移等于将数字除以二。
检查这段代码(只是为了演示最后一点):
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。
每个二元运算符都可以与=
组合使用。在所有情况下
dest op= expression
等同于
dest = dest op expression
这意味着(除非dest
具有任何副作用,否则它们仅发生一次)。
因此,这意味着
set>>=1;
等价于:
set = set >> 1;
由于 >>
是二进制右移运算符,它意味着将 set
中的值向右移动1位。
将位向右移动1位,相当于除以2。有关位移的更多信息,请参见http://msdn.microsoft.com/en-us/library/f96c63ed(v=vs.80).aspx