unsigned long set; /*set is after modified*/ set >>= 1;
字符串我在一个内核系统调用中发现了这个,但我不明白,它是如何工作的?
5fjcxozz1#
表达式set >>= 1;表示set = set >> 1;,它将set的位右移1(>>按位右移运算符检查Bitwise Shift Operators的自赋形式)。假设set为:
set >>= 1;
set = set >> 1;
set
1
>>
BIT NUMBER 31 n=27 m=17 0 ▼ ▼ ▼ ▼ set = 0000 1111 1111 1110 0000 0000 0000 0000
字符串在set >> = 1;之后,变量set变为:
set >> = 1;
BIT NUMBER 31 n=26 m=16 0 ▼ ▼ ▼ ▼ set = 0000 0111 1111 1111 0000 0000 0000 0000
型注意位数移位。注意一个有趣的观点:因为set是unsigned long,所以这个>>操作应该是logical shift(unsigned shift),所以逻辑移位不保留数字的符号位。另外,因为你把所有的位都向右移(移向较低的有效数字),所以一个右移是=把数字除以2。check this code(仅演示最后一点):
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
型(note:它并不意味着>>和/都是相同的)类似地,你有操作符<<=用于左移,检查其他可用的按位操作符和复合赋值操作符,还检查section:bit expressions和difference between:signed/arithmetic shift and unsigned shift。
/
<<=
p1tboqfb2#
如果你把一个整数的所有位都向右移1,那么你实际上是在“除以2”,因为二进制是以2为基数的数字系统。假设你有一个二进制的数字12:
1100 = 12 in binary 110 = 6 in binary (1100 right-shifted)
字符串就像如果你把一个以10为基数的数字的所有数字都向右移1,你就会被10整除。
bihw5rsg3#
每个二元运算符都可以与=组合。
=
dest op= expression
字符串相当于
dest = dest op expression
型(除非dest有任何副作用,它们只发生一次)。因此这意味着
dest
set>>=1;
型等同于:
型由于>>是二进制右移运算符,它意味着将set中的值右移1位。
qacovj5a4#
这会将位向右移位1,相当于除以2。有关位移位的详细信息,请参阅Bitwise Shift Operators (C)
mklgxw1f5#
上面的命令执行右移一位。请参阅c中的按位操作,来自此链接http://www.cprogramming.com/tutorial/bitwise_operators.html
5条答案
按热度按时间5fjcxozz1#
表达式
set >>= 1;
表示set = set >> 1;
,它将set
的位右移1
(>>
按位右移运算符检查Bitwise Shift Operators的自赋形式)。假设
set
为:字符串
在
set >> = 1;
之后,变量set
变为:型
注意位数移位。
注意一个有趣的观点:因为
set
是unsigned long
,所以这个>>
操作应该是logical shift(unsigned shift),所以逻辑移位不保留数字的符号位。另外,因为你把所有的位都向右移(移向较低的有效数字),所以一个右移是=把数字除以2。
check this code(仅演示最后一点):
型
和输出:
型
(note:它并不意味着
>>
和/
都是相同的)类似地,你有操作符
<<=
用于左移,检查其他可用的按位操作符和复合赋值操作符,还检查section:bit expressions和difference between:signed/arithmetic shift and unsigned shift。p1tboqfb2#
如果你把一个整数的所有位都向右移1,那么你实际上是在“除以2”,因为二进制是以2为基数的数字系统。
假设你有一个二进制的数字12:
字符串
就像如果你把一个以10为基数的数字的所有数字都向右移1,你就会被10整除。
bihw5rsg3#
每个二元运算符都可以与
=
组合。字符串
相当于
型
(除非
dest
有任何副作用,它们只发生一次)。因此这意味着
型
等同于:
型
由于
>>
是二进制右移运算符,它意味着将set
中的值右移1位。qacovj5a4#
这会将位向右移位1,相当于除以2。有关位移位的详细信息,请参阅Bitwise Shift Operators (C)
mklgxw1f5#
上面的命令执行右移一位。请参阅c中的按位操作,来自此链接http://www.cprogramming.com/tutorial/bitwise_operators.html