将二进制文字分配给 int 背后的逻辑
logic behind assign binary literals to an 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++,或者因为习惯于位运算符的程序员已经习惯了十六进制,所以他们仍然使用它们而不是二进制。
在代码中发现了该逻辑,但不明白其背后的原因;为什么使用它而不是分配正常的 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++,或者因为习惯于位运算符的程序员已经习惯了十六进制,所以他们仍然使用它们而不是二进制。