将二进制文字分配给 int 背后的逻辑

问题描述

代码上发现了该逻辑,但不知道背后的原因;为什么使用它而不是分配正常的int(它是 3D 环境中的角色控制器)

// assumes we're not blocked
int blocked = 0x00;

if ( its_a_floor )
        blocked |= 0x01;

if ( its_a_wall )
        blocked |= 0x02;

解决方法

0x00 是一个“正常的 int”。我们习惯于以 10 个表示为基数,但除了总共有 10 个手指之外,以 10 为基数并不特殊。当您在代码中使用整数文字时,您可以在十进制、八进制、十六进制和二进制表示形式之间进行选择(请参阅 here)。不要将值与其表示混淆。 0b01 是与 1 相同的整数。值实际上没有区别。

作为一个有趣的事实并说明上述内容,请考虑 0 实际上不是十进制文字。它是一个八进制文字。这并不重要,因为 0 在任何基数中都有相同的表示。

由于代码使用按位运算符,因此使用二进制文字最方便。例如,您可以很容易地看到 0b0101 | 0b10101 等于 0b1111,而 0b0101 & 0b1010 等于 0b0000。当使用基数为 10 的表示时,这并不明显。

但是,您发布的代码没有使用二进制文字,而是使用十六进制文字。这可能是因为自 C++14 以来二进制文字只是标准的 C++,或者因为习惯于位运算符的程序员太习惯于十六进制,他们仍然使用它们而不是二进制。