繁体   English   中英

这个“>> =”运算符在C中意味着什么?

[英]What does this “>>=” operator mean in C?

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

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

表达式set >>= 1; 表示set = set >> 1; 这是set1右移位(自动分配形式的>>按位右移运算符检查按位移位运算符 )。

假设如果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

请注意位数已移位。

注意一个有趣的观点:因为setunsigned 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM