cdh*_*wie 41
它表示按位不; 将翻转整数中的所有位,在这种情况下产生一个所有位都为1的数字.
请注意,由于它是无符号的,如果在赋值期间加宽整数,则扩展位将为0.例如,假设unsigned short
为2个字节且unsigned int
为4:
unsigned short s = ~0u; // 0xFFFF
unsigned int i = s; // 0x0000FFFF
Run Code Online (Sandbox Code Playgroud)
如果需要反转某些通用数字类型的位,T
则可以使用该构造~(T(0))
.
在C标准中比在C++标准中更好地描述了该运算符
4运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当转换后的操作数中的相应位未置位时,才会设置结果中的每个位).整数提升在操作数上执行,结果具有提升类型.如果提升类型是无符号类型,则表达式~E等于该类型中可表示的最大值减去E.
因此~0u
,当其内部表示的每个位设置为1时,表示unsigned int类型的对象的最大值.
考虑使用运算符将例如前n位设置为1.表达式将如下所示
~( ~0u << n )
Run Code Online (Sandbox Code Playgroud)
如果你想从m位置开始设置n位,那么你可以写
~( ~0u << n ) << m
Run Code Online (Sandbox Code Playgroud)
这意味着通过给出一个所有位都设置为1的数字来逐位翻转整数值的所有位.
(Assuming a 32 bit uint)
0u
00000000 00000000 00000000 00000000
~0u
11111111 11111111 11111111 11111111
3
00000000 00000000 00000000 00000011
~3
11111111 11111111 11111111 11111100
Run Code Online (Sandbox Code Playgroud)
如果机器对负整数使用 2的补码表示,则转换~0u
为有符号整数相当于-1
.Stack Overflow问题中有更多相关问题 -1和~0之间有区别吗?.
归档时间: |
|
查看次数: |
26170 次 |
最近记录: |