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 为基数的数字中的所有数字右移一位,你将被除以 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