Как определить, является ли число положительным или отрицательным? - PullRequest
56 голосов
/ 22 октября 2010

Меня спросили в интервью, как определить, является ли число положительным или отрицательным. Правила таковы, что мы не должны использовать условные операторы, такие как < и >, встроенные в функции Java (например, substring, indexOf, charAt и startsWith), без регулярных выражений или API .

Я сделал несколько домашних заданий по этому вопросу, код приведен ниже, но он работает только для целочисленного типа. Но они попросили меня написать общий код, который работает для float, double и long.

 // This might not be better way!!

 S.O.P ((( number >> 31 ) & 1) == 1 ? "- ve number " : "+ve number );

есть идеи с вашей стороны?

Ответы [ 33 ]

1 голос
/ 22 октября 2010

еще один вариант, который я мог придумать

private static boolean isPositive(Object numberObject) {
Long number = Long.valueOf(numberObject.toString());
return Math.sqrt((number * number)) != number;
}

 private static boolean isPositive(Object numberObject) {
Long number = Long.valueOf(numberObject.toString());
long signedLeftShifteredNumber = number << 1; // Signed left shift
long unsignedRightShifterNumber = signedLeftShifteredNumber >>> 1; // Unsigned right shift
return unsignedRightShifterNumber == number;
}
1 голос
/ 22 октября 2010

Этот пример приблизительно основан на ответе ItzWarty, но он запускается во время входа в систему! Предостережение: работает только для целых чисел.

Boolean isPositive(int a)
{
  if(a == -1) return false;
  if(a == 0) return false;
  if(a == 1) return true;
  return isPositive(a/2);
}
1 голос
/ 22 октября 2010

Целые числа тривиальны;это ты уже знаешь.Глубокая проблема заключается в том, как обращаться со значениями с плавающей точкой.В этот момент вам нужно узнать немного больше о том, как на самом деле работают значения с плавающей запятой.

Ключ Double.doubleToLongBits () , который позволяет получить представление IEEEчисла.(Метод на самом деле является прямым приведением под капотом, с небольшим количеством магии для работы со значениями NaN.) После того, как двойное преобразовано в длинное, вы можете просто использовать 0x8000000000000000L в качестве маски для выбора бит знака;если ноль, значение является положительным, а если оно - отрицательным.

1 голос
/ 04 августа 2011

Попробуйте это без кода: (x-SQRT(x^2))/(2*x)

1 голос
/ 23 октября 2010

Я думаю, что есть очень простое решение:

public boolean isPositive(int|float|double|long i){
    return (((i-i)==0)? true : false);
}

скажи мне, если я ошибаюсь!

1 голос
/ 22 октября 2010

Это кажется мне произвольным, потому что я не знаю, как вы могли бы получить число как любой тип, но как насчет проверки Abs (число)! = Число? Возможно && число! = 0

1 голос
/ 22 октября 2010

Не проверено, но иллюстрирует мою идею:

boolean IsNegative<T>(T v) {
  return (v & ((T)-1));
}
0 голосов
/ 12 сентября 2012

Комбинированные дженерики с двойным API.Думаю, это немного измена, но по крайней мере нам нужно написать только один метод:

0 голосов
/ 01 октября 2011
if (((Double)calcYourDouble()).toString().contains("-"))
        doThis();
else doThat();
0 голосов
/ 01 апреля 2011

А как насчет следующего?

T sign(T x) {
    if(x==0) return 0;
    return x/Math.abs(x);
}

Должно работать для каждого типа T ...

В качестве альтернативы можно определить abs (x) как Math.sqrt (x * x)и если это тоже обман, реализуйте свою функцию квадратного корня ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...