2016-09-21 2 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

_ «Мне нужно реализовать в моем собственном стиле» _ - почему? Какую специфическую проблему вы пытаетесь решить здесь? Что случилось с 'Math.Sign()'? Существуют ли какие-либо ограничения на вашей желаемой альтернативной реализации? Почему ваша версия настолько запутана? Что не так с возвратным значением <0? -1: (значение> 0? 1: 0); '(то есть почему _" без логического утверждения "_)? –

ответ

7

Интересная вещь о немного сдвигая: Если сдвиг вправо биты, ведущий бит будет распространяться направо.

Пример байт: 10000000 Пример байт >> 1: 11000000

Целые принимают 32 бита для представления. Итак, что произойдет, если мы сдвинем биты на 31 место? Ведущий бит всегда будет распространяться, то есть все положительные числа станут 0, а все отрицательные числа станут -1.

Поэтому:

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

возвратит 0 для положительных чисел и -1 для отрицательных чисел.

+0

Чтобы точно соответствовать условиям вопрос, это должно быть «return 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' ... –

Смежные вопросы