我理解 0u
表示0无符号,但开头的 ~
是什么意思?在这种情况下它是表示反转还是其他意思?
答案 0 :(得分:41)
它表示不按位;整数中的所有位都将被翻转,在这种情况下会产生一个所有位都为1的数字。
注意,由于它是无符号的,如果在赋值期间整数被加宽,则扩展位将为0.例如假设unsigned short
是2个字节而unsigned int
是4:
unsigned short s = ~0u; // 0xFFFF
unsigned int i = s; // 0x0000FFFF
如果您需要反转某些通用数字类型T
的位,则可以使用构造~(T(0))
。
答案 1 :(得分:9)
在C标准中比在C ++标准中更好地描述了该运算符
4~运算符的结果是它的按位补码 (提升)操作数(也就是说,结果中的每个位都是设置的 如果未设置转换后的操作数中的相应位)。该 对操作数执行整数提升,结果为 推广类型。如果提升的类型是无符号类型,则 表达式~E等于其中可表示的最大值 类型减去E.
因此~0u
表示当其内部表示的每个位设置为1时unsigned int类型的对象的最大值。
考虑使用运算符来设置例如前n位为1.表达式看起来像
~( ~0u << n )
如果要从m位置开始设置n位,则可以写
~( ~0u << n ) << m
答案 2 :(得分:9)
这意味着按位而不是通过给出一个所有位都设置为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
如果 ,机器使用2's complement表示负整数,则将~0u
转换为有符号整数等同于{{1} }。有关此内容的更多信息,请参阅Stack Overflow问题 Is there a difference between -1 and ~0? 。
答案 3 :(得分:3)
以位为单位反转值。例如:
00000000000000000001
到
11111111111111111110
这是~
的作用。