2016-09-21 11 views
-1

我想得到一个没有逻辑语句的数字的符号。已经有一个预定义的方法可用Math.Sign()。但我需要以我自己的风格实施。在C中获得一个没有逻辑语句的数字的符号#

久经考验的C#代码:

public int GetSign(int value) 
{ 
    int bitFlag = 1; 

    var m = Convert.ToString(value, 2); 
    int length = m.Length; 

    if (m[length - 1] == '1') 
    { 
     bitFlag = -1; 
    } 

    return bitFlag; 
} 

条件:

  • 如果最后一位是1然后返回-1
  • 如果最后一位是0然后返回1

请作为SIST我,如何去除上述IF声明...

+0

“条件”如何与数字和'Math.Sign()'的符号相关?你正在检查数字是奇数还是偶数,而不是它的符号。 – zerkms

+1

_“我需要以我自己的风格实现”_ - 为什么?你想在这里解决什么_specific_问题? Math.Sign()有什么问题?你希望的替代实现是否有任何限制?为什么你的版本如此复杂?返回值<0有什么问题? -1:(value> 0?1:0);'(即为什么_“没有逻辑语句”)? –

回答

7

有趣的事情有关位移位: 如果你的位向右移位,领先位将传播在右边。

例字节:千万 例字节>> 1:11000000

整数采取32位来表示。那么如果我们将位数移位31位,会发生什么?前导位将始终传播,这意味着所有正数将变为0,所有负数将变为-1。

因此:

public static int signOfInt(int input) 
{ 
    return (input >> 31); 
} 

将返回0正数-1负数。

+0

要精确地匹配条件这个问题需要返回2 *(input >> 31)+ 1;'但是我认为最后一部分是微不足道的,因为答案被接受了。 – Jaquez

0

我认为这会做

public int GetSign(int value) 
{ 
    return -(((value & 1) << 1) - 1); 
} 
+0

1返回1而不是-1:http://ideone.com/U4rfYc – Backs

+0

请检查数字'3'和'-3',然后是'500'和'-500' ... – 2016-09-21 04:50:29