代码之家  ›  专栏  ›  技术社区  ›  willeM_ Van Onsem

按位相等

  •  3
  • willeM_ Van Onsem  · 技术社区  · 14 年前

    我需要在两个字节之间执行位相等。这意味着,例如,如果我有两个字节:00011011和00011110,结果是11111 010 我看到的唯一快速的方法是使用下面的语句

    byte a, b;//set input bytes
    byte c = ~(a^b);//output bytes
    

    但我想知道是否有更快的解决方案。在这些相等操作之后,我想屏蔽我需要的位。所以我需要使用和操作。所以代码变成:

    byte a, b;//set input bytes
    byte m;//mask, intresting bits are set to 1, others to 0
    byte c = (~(a^b))&m;//output bytes
    

    难道没有任何更快更简单的方法不需要使用所有这些位操作,因为这部分代码将经常被调用吗?

    4 回复  |  直到 14 年前
        1
  •  6
  •   Mark Byers    14 年前

    我怀疑它能在更少的操作中完成。这看起来是最理想的。也许您可以将~(a^b)存储在查找表(256*256个条目)中?我怀疑你会得到很多好处,甚至可能使事情更糟,但你可以试试看。

        2
  •  4
  •   Chris Marsh    14 年前

    对于这种优化,您寻找的位置是错误的;您最终不会在这里找到任何更好的位操作。即使你这样做了,也很难加快速度。真正的胜利将来自于一次处理的不仅仅是一个字节。处理器已经需要做大量的位移位和屏蔽操作,这样它就可以假装您正在处理字节。一次处理字节1个字的数组,或者使用向量指令(如果可用)。

        3
  •  2
  •   Grzenio    14 年前

    这些行动似乎足够快,可以说是诚实的。我认为你不应该试图进一步优化它们,而是先完成你的软件,看看你对整体性能是否满意,如果不满意的话,使用一个分析器。我相当肯定问题会出在别的地方。

        4
  •  2
  •   Michael Krauklis    14 年前

    您需要的是XNOR操作。不幸的是,C/Mono不支持这种功能。我认为你的解决方案是最佳的。