~ 和 - 的区别

幽灵奥吉

所以我在胡夫曼编码上乱搞,我注意到一些我觉得我应该已经知道的事情,但很遗憾没有。

有问题的东西在标题中,与这种方法有关:

void BinWriter::writeBit(bool b) {
    A ^= (-b^A)&(1UL << n++); // A is of type char

    if (n == 8) {
        ofd.write((char*)&A, 1);
        n = 0;
    }
}

如果我写~b而不是-b结果有很大的不同。为什么是这样?不是~假设是否定运算符吗?它与-本例有何不同

此外,Visual Studio (2017) 也警告我这两个运算符对于 bool 类型都是“不安全的”,这是为什么?

持有

您正在与整数提升发生冲突不太科学的解释是,对于某些运算符,如果没有明确定义,C++ 会尝试将内置整数类型(包括bool)转换为int. 然后,这会导致以下结果:

#include <iostream>
int main()
{
    std::cout << std::boolalpha;
    std::cout << "~: " << ~true << ", " << ~false << "\n";
    std::cout << "-: " << -true << ", " << -false << "\n";
    std::cout << "!: " << !true << ", " << !false << "\n";
}

将打印

~: -2, -1
-: -1, 0
!: false, true

注意!这些运算符中唯一一个是如何实际定义的bool,而其他两个则强制整数提升(false变成 0 和true1)。

-b^Athen 表示“如果,则以相同的方式保留所有位,如果bfalse,则将它们全部翻转”,而表示“始终翻转所有位,但仅当时才翻转最后一位” - 完全不同的语义!btrue~b^Abfalse

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章