c++ - 检查给定的整数组是否包含 0 值
问题描述
假设我有一堆整数(10~20),需要检查其中是否有任何一个等于 0。最有效的方法是什么?我不想评估一个巨大的 if(a=0 || b=0 || c=0 ||...) 语句。我想到了 if(a b c... = 0) 但如果我没记错的话,乘法并不是一个很快的过程。是否有任何其他技巧,例如可行的位操作?我正在尝试尽可能低的级别以使其超级高效。
解决方案
我很确定最快和最清晰的方法是使用显式测试:
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
文件。
推荐阅读
- python - 'reCAPTCHA:ERROR for site owner: Invalid domain for site key' 当我在 python 中使用请求获取网站时出现错误。如何登录?
- android - 为什么我的活动仍然在顶部显示标题栏?
- python - Pandas 数据框 .at ValueError:无法将字符串转换为浮点数
- c++ - 对函数的输出字符串参数使用交换与赋值
- android - 移动设备的实际尺寸是多少?
- react-native - React Native Expo 任务管理器
- c++ - 在 _T 值中使用 CString
- c# - 动态创建的文件不在解决方案资源管理器中
- raspberry-pi - 让我的网络服务器从外部设备工作的问题
- java - Use Java Gmail API to send an email with multiple (large) attachments