【发布时间】:2014-10-24 19:43:43
【问题描述】:
我明白0u的意思是0 unsigned,但是开头的~是什么意思呢?在这种情况下,它表示反转还是意味着其他什么?
【问题讨论】:
-
这就是为什么
numeric_limits<unsigned int>::max()是一件事。 -
要小心,因为如果将结果存储在更大的整数中,额外的位仍然是 0。
标签: c++
我明白0u的意思是0 unsigned,但是开头的~是什么意思呢?在这种情况下,它表示反转还是意味着其他什么?
【问题讨论】:
numeric_limits<unsigned int>::max()是一件事。
标签: c++
表示按位不;整数中的所有位都将被翻转,在这种情况下会产生一个所有位都为 1 的数字。
请注意,由于它是无符号的,如果整数在分配期间被加宽,则扩展位将为 0。例如,假设 unsigned short 是 2 个字节,unsigned int 是 4:
unsigned short s = ~0u; // 0xFFFF
unsigned int i = s; // 0x0000FFFF
如果您需要反转某些通用数字类型T 的位,则可以使用构造~(T(0))。
【讨论】:
template <typename T> T bitwise_not(T v) { return ~v; },但如果您在专业环境中这样做,请准备好嘲笑。 ;)
~0 在这种情况下更清晰、更合适。
~0)。
这个运算符在 C 标准中比在 C++ 标准中描述得更好
4 ~ 运算符的结果是它的按位补码 (提升)操作数(即,结果中的每一位都被设置当且仅 如果未设置转换后的操作数中的相应位)。这 对操作数执行整数提升,结果有 提升的类型。如果提升的类型是无符号类型,则 表达式 ~E 等价于可表示的最大值 键入减 E。
因此~0u 表示当其内部表示的每一位都设置为 1 时 unsigned int 类型的对象的最大值。
考虑使用运算符将例如前 n 位设置为 1。表达式如下所示
~( ~0u << n )
如果你想从 m 位置开始设置 n 位,那么你可以写
~( ~0u << n ) << m
【讨论】:
这意味着 按位非,它通过给您一个所有位都设置为 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?。
【讨论】:
~0u 绝不意味着-1——它是无符号的! (尽管可以将其转换为有符号整数)
~0u 转换为签名int 是实现定义的
~0u 总是保证等于-1,因为~0u + 1u == 0u(即~0u 是1u 的加法逆元)。另外:stackoverflow.com/questions/22801069/…
它是以位为单位反转值。例如:
00000000000000000001
到
11111111111111111110
这就是~ 所做的。
【讨论】: