C中的“>>=”运算符是什么意思?

vs91vp4v  于 11个月前  发布在  其他
关注(0)|答案(5)|浏览(90)
unsigned long set;
/*set is after modified*/
set >>= 1;

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

5fjcxozz

5fjcxozz1#

表达式set >>= 1;表示set = set >> 1;,它将set的位右移1>>按位右移运算符检查Bitwise Shift Operators的自赋形式)。
假设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,所以这个>>操作应该是logical shiftunsigned shift),所以逻辑移位不保留数字的符号位。
另外,因为你把所有的位都向右移(移向较低的有效数字),所以一个右移是=把数字除以2。
check this code(仅演示最后一点):

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


(note:它并不意味着>>/都是相同的)
类似地,你有操作符<<=用于左移,检查其他可用的按位操作符和复合赋值操作符,还检查section:bit expressions和difference between:signed/arithmetic shift and unsigned shift

p1tboqfb

p1tboqfb2#

如果你把一个整数的所有位都向右移1,那么你实际上是在“除以2”,因为二进制是以2为基数的数字系统。
假设你有一个二进制的数字12:

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

字符串
就像如果你把一个以10为基数的数字的所有数字都向右移1,你就会被10整除。

bihw5rsg

bihw5rsg3#

每个二元运算符都可以与=组合。

dest op= expression

字符串
相当于

dest = dest op expression


(除非dest有任何副作用,它们只发生一次)。
因此这意味着

set>>=1;


等同于:

set = set >> 1;


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

qacovj5a

qacovj5a4#

这会将位向右移位1,相当于除以2。有关位移位的详细信息,请参阅Bitwise Shift Operators (C)

mklgxw1f

mklgxw1f5#

上面的命令执行右移一位。请参阅c中的按位操作,来自此链接http://www.cprogramming.com/tutorial/bitwise_operators.html

相关问题