【问题标题】:logic behind assign binary literals to an int [closed]将二进制文字分配给 int 背后的逻辑 [关闭]
【发布时间】:2021-07-23 12:20:21
【问题描述】:

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

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

if ( its_a_floor )
        blocked |= 0x01;

if ( its_a_wall )
        blocked |= 0x02;

【问题讨论】:

  • 更容易使用:这样想。如果您需要提取我们是否在场的信息,请使用blocked & 0x01。如果你想看看我们是否在墙旁边,我们采取blocked & 0x02。如果我们都想要blocked & 0x03。我们也可以在这个里面添加其他的状态,并且包装的很整齐
  • 按原样,毫无意义。如果你碰巧碰到两位数或三位数,0x101 比 257 更能说明二进制表示。
  • 节省空间。如果空间不是问题,那么您可以有几个标志,blockedByFloorblockedByWall。有些人喜欢使用 int 中的位。它让程序员的生活更有趣。
  • 在 CPU 上也更快? (基本上我得到的是,它是一种在位级别打包信息的经济方式,直接将其解包为最小值)
  • “为什么使用它而不是分配普通的int?”是什么意思??你的意思是代替blocked = 0x01blocked = 0x02?所以基本上为什么作者使用|=而不是=

标签: c++ bitwise-or


【解决方案1】:

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

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

由于代码使用按位运算符,因此使用二进制字面量是最方便的。例如,您可以很容易地看到0b0101 | 0b10101 等于0b1111 并且0b0101 & 0b1010 等于0b0000。这在使用 base 10 表示时并不那么明显。

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

【讨论】:

  • 谢谢你的回答有道理;可能错过了提出我的问题:“这样做背后的逻辑是什么”
猜你喜欢
  • 2023-02-22
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2020-11-12
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多