gpt4 book ai didi

c++ - 测试多个变量值是否全部为正或负

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:39 30 4
gpt4 key购买 nike

C/C++ 中是否有一种快速有效的方法来测试多个变量是全部为正值还是全部为负值?

假设有 5 个变量要测试:

变体 1

int test(int a[5]) {
if (a[0] < 0 && a[1] < 0 && a[2] < 0 && a[3] < 0 && a[4] < 0) {
return -1;
} else if (a[0] > 0 && a[1] > 0 && a[2] > 0 && a[3] > 0 && a[4] > 0) {
return 1;
} else {
return 0;
}
}

变体 2

int test(int a[5]) {
unsigned int mask = 0;
mask |= (a[0] >> numeric_limits<int>::digits) << 1;
mask |= (a[1] >> numeric_limits<int>::digits) << 2;
mask |= (a[2] >> numeric_limits<int>::digits) << 3;
mask |= (a[3] >> numeric_limits<int>::digits) << 4;
mask |= (a[4] >> numeric_limits<int>::digits) << 5;
if (mask == 0) {
return 1;
} else if (mask == (1 << 5) - 1) {
return -1;
} else {
return 0;
}
}

变体 2a

int test(int a[5]) {
unsigned int mask = 0;
for (int i = 0; i < 5; i++) {
mask <<= 1;
mask |= a[i] >> numeric_limits<int>::digits;
}
if (mask == 0) {
return 1;
} else if (mask == (1 << 5) - 1) {
return -1;
} else {
return 0;
}
}

我应该选择哪个版本?使用变体 2/2a 比 1 有什么优势吗?或者有更好/更快/更清洁的方法吗?

最佳答案

我认为您的问题与您要查找的内容不一致。您问的是如何检测它们是有符号还是无符号,但您的意思似乎是如何检测它们是正数还是负数。

所有阴性的快速测试:

if ((a[0]&a[1]&a[2]&a[3]&a[4])<0)

和所有非负数(>=0):

if ((a[0]|a[1]|a[2]|a[3]|a[4])>=0)

我想不出一个好的方法来立即测试它们是否都是严格正值(不是零),但应该有一个。

请注意,这些测试对于二进制补码系统(现实世界中您会关心的任何东西)来说是正确且可移植的,但对于补码或符号幅度来说它们略有错误。如果您真的关心它们,它们可能会被修复。

关于c++ - 测试多个变量值是否全部为正或负,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5790595/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com