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

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

4

5 回答 5

58

该表达式的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

(注意:它并不意味着>>并且/都相同)

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

于 2013-07-21T07:13:21.060 回答
16

这个“右移”是值一位。如果将整数的所有位向右移动 1,那么您实际上是“除以 2”,因为二进制是基于 2 的编号系统。

想象一下,你有二进制数字 12:

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

就像如果你将一个以 10 为基数的数字中的所有数字右移一位,你将被除以 10。

于 2013-07-21T07:14:12.940 回答
6

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

dest op= expression

相当于

dest = dest op expression

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

所以这意味着

set>>=1;

相当于:

set = set >> 1;

由于>>是二元右移运算符,因此意味着将值set右移 1 位。

于 2013-07-21T07:18:13.363 回答
4

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

于 2013-07-21T07:14:44.863 回答
1

上面的命令执行右移一位。从这个链接http://www.cprogramming.com/tutorial/bitwise_operators.html参考 c 中的按位操作

于 2013-07-21T07:17:31.407 回答