【问题标题】:Algorithmic efficiency in selecting based on bits基于位选择的算法效率
【发布时间】:2011-05-16 17:04:10
【问题描述】:

我想知道您在开发一种基于位执行 if/else 切换/案例的有效算法时有何想法。我有 8 位可以使用,我需要将它们分为高阶位和低阶位,如下所示:

0000 1111

每一半都包含一些关于哪些位被打开的信息。例如,如果下半部分(这个小端机器中的1111)实际上是0010,就会发生一些事情。此外,如果高端是1000,则会发生其他情况。

我想将上半部分右移并进行AND 比较会很有效(比如(x >> 4) & 8),但我不确定下半部分做什么更聪明,因为左移和比较一些奇怪的数字。

再次感谢您的见解。

【问题讨论】:

    标签: c logic bit bit-shift bits


    【解决方案1】:

    首先,您示例中的(x >> 4) & 8 不太正确。要将高半字节(前四位)与n 进行比较,您需要((x >> 4) & 15) == n

    要将下半字节与n 进行比较,您只需丢失右移:(x & 15) == n

    【讨论】:

    • 使用(x & 15) == n,因为x & 15 == nx & (15 == n) 相同。这是一个历史性的意外——&| 运算符在古代历史上的使用与 &&|| 一样,并且优先规则被卡住了。
    【解决方案2】:

    要屏蔽低 4 位,您可以使用 bits & 0xf,如果您想检查这 4 位是否具有特定值(即 2 即 0010),您可以使用 ( bits & 0xf ) == 2 用于下半部分,( bits >> 4 ) == 2上半部分。

    当您只查看一个字节时,Endianess 没有任何区别。

    【讨论】:

      【解决方案3】:

      我不知道你是想要一些高效的东西,就像你说的,还是聪明的东西。如果你真的想要快速执行,没有什么比一个有 256 个 case 的 switch 语句更快的了。看看编译器为 switch 生成的代码,你会发现它非常快。

      如果您想要一些聪明的东西,那就另当别论了。但是,无论它多么聪明,它永远不会比开关快。

      【讨论】:

      • 这很有趣。是不是因为几乎所有东西都被提炼成一个 switch 语句?
      • @Rio - 不,这更像是一些编写编译器的人是拥有 20 年优化优化经验的博士。为什么你认为我们可以轻松击败?
      • 嗯,开关不一定是现代 CPU 上最快的处理方式,尤其是在 256 箱的情况下不是相当大的。切换会导致分支和流水线化 CPU 讨厌如果它们无法预测正确的分支并且大型切换表意味着大量代码对指令缓存不利。有时可以通过巧妙的位操作完全避免分支,如果可能的话,使用查找表而不是开关通常会更快。您可以在这些出色的手册中阅读有关此主题的更多信息:agner.org/optimize
      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 2021-10-10
      • 2018-05-20
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 2021-07-30
      相关资源
      最近更新 更多