3

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

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

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

4

3 回答 3

2

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

于 2012-07-30T02:42:16.777 回答
1

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

于 2012-07-30T02:45:25.370 回答
0

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

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

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

于 2012-07-30T02:52:34.480 回答