C:在执行未签名的变量,而铸造符号比较
-
28-09-2019 - |
题
我想用下面的签名的函数:
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
)
不隶属于 StackOverflow