我想用下面的签名的函数:

bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b);

其输出应当是当且仅当1存储在a中的比特的二进制补码视图比2的存储在b的位的补体视图更大。否则输出应该是0。例如:

signed_a_greater_than_signed_b(0b10000000,any number) => 0
signed_a_greater_than_signed_b(0b01111111,any number other than 0b01111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000001) => 0
signed_a_greater_than_signed_b(0b00000000,0b11111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000000) => 0

该函数是的不具有任何隐式/显式转换(因为这些转换是 实现定义的,因此不便于携带)

一个这样的实现是:

bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b)
{
    // if 'signed' a is positive then 
    //     return 1 if a is greater than b or b is negative
    // otherwise, if 'signed' a is negative then 
    //     return 1 if a is greater than b and b is negative
    if (a <= 0b01111111) return ((b < a) || (b > 0x01111111));
    else                 return ((b < a) && (b > 0x01111111));
}

您可以建议使用算术,而不是条件语句来执行此计算的实现?你可以使用一个条件,如果你必须

使用用C比较和算术UN /签署变量的混合是一个灾难。这个功能是如何绕过这个问题的例子。

我想的后面签署变量的比较组件类似于我想要实现(上不支持符号比较架构)功能

有帮助吗?

解决方案

假设2的补码:

return (a^signbit) > (b^signbit);

其中signbit明显的表示的MSB。

其他提示

  

你可以使用一个条件,如果你必须

您已经使用只有一个条件的解决方案。 ;)

当你想有算术运算,而不是条件语句,我认为我们的目标是速度。并使用查表是速度甚至比算术。由于使用的是8个字符,查找表的装置没有矫枉过正:你甚至不需要大小256×256的表。 256的表的大小是完全足够存储用于指示值(S)a可以具有导致真(或假)b的每个值的限制。每个函数调用仅需要执行一个查表(a - > limit)和一个比较(limit <> b

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top