给定两个整数,如何在不使用if语句或选择(> =,>和=)的情况下区分两个整数,最大值,最小值和相等。我考虑过使用fmin
和fmax
,但我还需要知道如何知道两个整数是否相同。
答案 0 :(得分:4)
假设2的补码算术:
int intcmp(int int1, int int2)
{
int diff=int2-int1;
unsigned int udiff;
memcpy(&udiff, &diff, sizeof(diff));
if(!udiff)
return 0; /* the two integers are equal */
else if(udiff & 1<<(sizeof(udiff)*CHAR_BIT-1)) /* check the sign */
return +1; /* int1 < int2 */
else
return -1; /* int2 < int1 */
}
答案 1 :(得分:1)
怎么样......
(num1-num2) ? ((num1-num2) & (MAX_INT+1) ? NEGATIVE : POSITIVE) : EQUAL
答案 2 :(得分:0)
“差异化”是什么意思?你不能在没有某种分支操作的情况下选择两个不同的执行路径,但理论上你可以加载一个带有函数指针的数组并操纵数字来选择要调用的不同数组元素(并且调用是一种形式分支)。
您可以更轻松地使用两个不同的字符串指针加载数组,并根据您获得的数字选择要打印的数组。
您可以根据数字是奇数还是通过AND与1将数字转换为0或1,例如。您可以通过减去它们并查看是否为零来确定数字是否相等。等
答案 3 :(得分:0)
您可以使用以下内容生成遮罩
signed int x = ...;
signed int y = ...;
mask = (x - y) >> 31;
如果y&gt; x,则mask
为-1
,否则为0
(但要注意溢出)。然后,您可以使用&
,|
和~
来使用此掩码构建结果。