【问题标题】:What does the assignment of ~0u to a variable mean in C++? [duplicate]在 C++ 中,将 ~0u 赋值给变量意味着什么? [复制]
【发布时间】:2014-10-24 19:43:43
【问题描述】:

我明白0u的意思是0 unsigned,但是开头的~是什么意思呢?在这种情况下,它表示反转还是意味着其他什么?

【问题讨论】:

  • 这就是为什么numeric_limits<unsigned int>::max()是一件事。
  • 要小心,因为如果将结果存储在更大的整数中,额外的位仍然是 0。

标签: c++


【解决方案1】:

表示按位不;整数中的所有位都将被翻转,在这种情况下会产生一个所有位都为 1 的数字。

请注意,由于它是无符号的,如果整数在分配期间被加宽,则扩展位将为 0。例如,假设 unsigned short 是 2 个字节,unsigned int 是 4:

unsigned short s = ~0u; // 0xFFFF
unsigned int i = s;     // 0x0000FFFF

如果您需要反转某些通用数字类型T 的位,则可以使用构造~(T(0))

【讨论】:

  • 非常狡猾,我以前从未见过。我认为这属于晦涩难懂的专栏。
  • @Cyber​​ 没有你想象的那么晦涩。
  • @Cyber​​ 我不同意;我希望专业的 C++ 开发人员至少知道该语言中存在哪些运算符以及它们的作用。如果它困扰您,那么您可以写template <typename T> T bitwise_not(T v) { return ~v; },但如果您在专业环境中这样做,请准备好嘲笑。 ;)
  • @Cyber​​ 取决于上下文。如果目标是“这种类型的最大整数”,那么是的,我绝对 100% 同意这会更好。如果赋值的目标是创建一个所有位都打开的位域,~0 在这种情况下更清晰、更合适。
  • 这种事情在 C 编程中很常见,在处理 C 级内容(系统编程、硬件接口)甚至只是状态标志、位域等的代码中,你会经常看到这种类型的代码(~0)。
【解决方案2】:

这个运算符在 C 标准中比在 C++ 标准中描述得更好

4 ~ 运算符的结果是它的按位补码 (提升)操作数(即,结果中的每一位都被设置当且仅 如果未设置转换后的操作数中的相应位)。这 对操作数执行整数提升,结果有 提升的类型。如果提升的类型是无符号类型,则 表达式 ~E 等价于可表示的最大值 键入减 E。

因此~0u 表示当其内部表示的每一位都设置为 1 时 unsigned int 类型的对象的最大值。

考虑使用运算符将​​例如前 n 位设置为 1。表达式如下所示

~( ~0u << n )

如果你想从 m 位置开始设置 n 位,那么你可以写

~( ~0u << n ) << m

【讨论】:

    【解决方案3】:

    这意味着 按位非,它通过给您一个所有位都设置为 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?

    【讨论】:

    • -1: ~0u 绝不意味着-1——它是无符号的! (尽管可以将其转换为有符号整数)
    • 没错,我忘记了'casted to signed'部分,抱歉。固定。
    • -1 -> +1 :)(额外字符)
    • ~0u 转换为签名int 是实现定义的
    • @BillyONEal 对我来说似乎有点挑剔。由于该标准保证了 2 对无符号的补码行为,那么它也保证了它是一个加法阿贝尔群。因此,~0u 总是保证等于-1,因为~0u + 1u == 0u(即~0u1u 的加法逆元)。另外:stackoverflow.com/questions/22801069/…
    【解决方案4】:

    它是以位为单位反转值。例如:

    00000000000000000001

    11111111111111111110

    这就是~ 所做的。

    【讨论】:

    • 是的,你 ryt texasbruce
    猜你喜欢
    • 2020-09-08
    • 2015-04-05
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2012-05-02
    相关资源
    最近更新 更多