unsigned long set;
/*set is after modified*/
set >>= 1;
我在内核系统调用中发现了这个,但我不明白,它是如何工作的?
答案 0 :(得分:24)
表达式set >>= 1;
表示set = set >> 1;
是set
的右移位1
(>>
按位右移运算符检查{set
3}})。
假设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;
}
操作应为Bitwise Shift Operators(logical shift)逻辑移位不会保留数字标志位。
此外,因为您将所有位向右移动(向较低有效数字移动)所以右移是=将数字除以2。
unsigned shift(只是为了证明最后一点):
set :134152192
set :134152192
输出:
>>
(注意:它不代表/
且<<=
都相同)
同样,您有左移的运营商{{1}},请检查其他可用的check this code和Bitwise operators,同时查看以下部分:Compound assignment operators以及:bit expressions之间的差异。
答案 1 :(得分:9)
这个“右移”的值是一位。如果将整数的所有位向右移动1,则有效地“除以2”,因为二进制是基数为2的编号系统。
想象一下你的二进制数为12:
1100 = 12 in binary
110 = 6 in binary (1100 right-shifted)
就像你将一个基数为10的数字中的所有数字一个一个地移动一样,你将除以10。
答案 2 :(得分:4)
这将位向右移位1,相当于除以2.有关位移的更多信息,请参阅http://msdn.microsoft.com/en-us/library/f96c63ed(v=vs.80).aspx
答案 3 :(得分:3)
每个二元运算符都可以与=
结合使用。在所有情况下
dest op= expression
相当于
dest = dest op expression
(除非dest
有任何副作用,否则只会发生一次)。
所以这意味着
set>>=1;
相当于:
set = set >> 1;
由于>>
是二元右移运算符,它意味着将set
中的值右移1位。
答案 4 :(得分:1)
上面的命令执行右移一位。在此链接中查看c中的位操作http://www.cprogramming.com/tutorial/bitwise_operators.html