在C++中将〜0u赋值给变量是什么意思?

rye*_*ger 28 c++

我理解的0u意思是0无符号,但~开头是什么意思?在这种情况下它是表示反转还是其他意思?

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)).

  • @Cyber​​不像你想象的那么模糊. (7认同)
  • @Cyber​​取决于上下文.如果目标是"这种类型的最大整数"那么是的,我绝对100%同意会更好.如果赋值的目标是创建一个所有位都打开的位域,则"〜0"在该上下文中更清晰且更合适. (7认同)
  • @Cyber​​我不同意; 我希望专业的C++开发人员*至少*知道语言中存在哪些运算符以及它们的作用.如果它困扰你,那么你可以写`template <typename T> T bitwise_not(T v){return~v; 如果你在专业的环境中这样做,那么请准备好嘲笑.;) (6认同)
  • 这种事情在C编程中非常普遍,在处理C级事物(系统编程,硬件接口)甚至只是状态标志,位域等等的代码中,你会看到这种类型的代码(`〜 0`)很多. (4认同)
  • 非常偷偷摸摸,我以前从未见过.我认为这属于晦涩难懂的专栏 - 但是它起作用 - 我猜. (3认同)
  • 这一点,我只是喜欢像`numeric_limits <unsigned int> :: max()`之类的东西,因为乍一看你的拍摄非常清楚. (2认同)

Vla*_*cow 9

在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)


Mar*_* A. 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
Run Code Online (Sandbox Code Playgroud)

如果机器对负整数使用 2的补码表示,则转换~0u为有符号整数相当于-1.Stack Overflow问题中更多相关问题 -1和~0之间有区别吗?.