c++ - ~ 和 - 之间的区别

标签 c++ bitwise-operators bit huffman-code

所以我在胡思乱想霍夫曼编码,我注意到一些我觉得我应该已经知道,但遗憾的是不知道的事情。

问题在标题中,与此方法有关:

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 和 true 变成 1)。

-b^A 表示“如果 bfalse,则所有位保持相同,如果 ,则翻转它们>btrue”,而 ~b^A 表示“始终翻转所有位,但只有当 bfalse” - 完全不同的语义!

关于c++ - ~ 和 - 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50427068/

相关文章:

python - while 循环会执行多少次?

python - 可以在没有 Visual Studio 的情况下使用 MinGw 编译 python.exe

c++ - 从模板类切换时,为什么出现<错误类型>?

c++ - move 包含 vector<unique_ptr<T>> 的可分配类

JavaScript trunc() 函数

java - Java 中的字节 0xFF (11111111) 发生了什么?

将 32 位数字转换为四个 8 位数字

C - 将一个字节的三位与一个字节组合

Java 迭代字节数组中的位

c++ - 使用多重继承来区分使用角色?