【问题标题】:C OR large block of memory without loopC OR 没有循环的大块内存
【发布时间】:2012-07-30 02:37:46
【问题描述】:

我有一个看起来像这样的函数void doSomething(unsigned char buff[50]); 我想在我的函数中做的是快速确定buff是否全部为空。

为此,我想我可以按位 缓冲区并检查结果是否为零,因为任何 on 字节都会导致按位 或 为 1。结果为零表示数组中的所有字节都为零。

在 C 中是否有一种简单的方法可以在不循环整个缓冲区的情况下做到这一点? 如果是跨平台就好了。

【问题讨论】:

标签: c null


【解决方案1】:

没有。但是您可以通过在进行检查之前强制转换为 32 位或 64 位类型来减少迭代次数。只需确保正确处理末尾的额外 16 位即可。

【讨论】:

    【解决方案2】:

    不可移植,但在 x86 上,您可以使用 REP SCAS{B,W,D} instructions 在 x86 上执行此操作。

    【讨论】:

      【解决方案3】:

      我认为部分答案还取决于缓冲区的长度。

      如果您的缓冲区是 50 字节长(也就是说,如果它很短并且在编译时知道它的长度),是的,按位 OR(和转换,正如 Ignacio 在另一个答案中所说)似乎是正确的解决方案。

      否则,我会以老式方式对循环进行编码(即测试每个字节是否为零)并让编译器优化为我展开循环。

      【讨论】:

        猜你喜欢
        • 2013-10-08
        • 1970-01-01
        • 2014-05-17
        • 2016-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        相关资源
        最近更新 更多