首页 > 解决方案 > 检查给定的整数组是否包含 0 值

问题描述

假设我有一堆整数(10~20),需要检查其中是否有任何一个等于 0。最有效的方法是什么?我不想评估一个巨大的 if(a=0 || b=0 || c=0 ||...) 语句。我想到了 if(a b c... = 0) 但如果我没记错的话,乘法并不是一个很快的过程。是否有任何其他技巧,例如可行的位操作?我正在尝试尽可能低的级别以使其超级高效。

标签: c++c

解决方案


我很确定最快和最清晰的方法是使用显式测试:

int has_zero = !a || !b || !c || !d || !e ...;

因为||and&&是 C 中的短路运算符,所以一旦知道最终结果,评估就会停止,因此如果(例如)b变量为零,则满足表达式为真并停止评估其余部分。

@AbhayAravinda 建议!(a && b && c && d ...)可能更有效,但我不这么认为;因为这不是做一个显式的非操作,而是一个低级的零测试,这对于几乎任何架构来说都是一个非常简单的测试,可以可靠地完成。我快速浏览了两个版本的优化汇编程序,并没有明显的性能赢家,但我认为第一个版本更清晰。

如果每个周期都很重要,那么请检查您平台上的两个版本,但在我的 64 位 Intel 系统上,gcc 和 clang 实际上都会为两个版本生成相同的程序集(启用了优化)。

简单的测试代码:

int a, b, c, d, e, f;

int test_or()
{
    return !a || !b || !c || !d || !e || !f;
}

int test_and()
{
    return ! (a && b && c && d && e && f);
}


int main()
{
    return test_or() | test_and();
}

编译它gcc -S -O testfile.c并查看生成的.s文件。


推荐阅读