在C语言中,">>="运算符是什么意思?

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

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

5个回答

68

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

注意移位的比特数。

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

类似地,您可以使用左移运算符<<=进行左移操作,查看其他可用的按位运算符复合赋值运算符,还要查看比特表达式部分以及有符号/算术移位和无符号移位之间的区别


17

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

想象一下你有一个十进制数12的二进制表示:

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

就像你把十进制数字中的所有数字向右移动一位,你就相当于除以10。


6

每个二元运算符都可以与=组合使用。在所有情况下

dest op= expression

等同于

dest = dest op expression

这意味着(除非dest具有任何副作用,否则它们仅发生一次)。

因此,这意味着

set>>=1;

等价于:

set = set >> 1;

由于 >> 是二进制右移运算符,它意味着将 set 中的值向右移动1位。


4

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接