Как определить, является ли число положительным или отрицательным? - 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 ]

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

Я не знаю, как именно Java приводит числовые значения, но ответ довольно прост, если поместить в псевдокод (я оставляю вам детали):

sign(x) := (x == 0) ? 0 : (x/x)
0 голосов
/ 22 октября 2010

Если вам разрешено использовать «==», как кажется, вы можете сделать что-то подобное, воспользовавшись тем, что будет сгенерировано исключение, если индекс массива выходит за пределы. Код для double, но вы можете привести любой числовой тип к double (здесь возможная потеря точности не будет иметь никакого значения).

Я добавил комментарии, чтобы объяснить процесс (введите значение в] -2.0; -1.0] union [1.0; 2.0 [), а также небольшой тестовый драйвер.

class T {

   public static boolean positive(double f)
   {
       final boolean pos0[] = {true};
       final boolean posn[] = {false, true};

       if (f == 0.0)
           return true;

       while (true) {

           // If f is in ]-1.0; 1.0[, multiply it by 2 and restart.
           try {
               if (pos0[(int) f]) {
                   f *= 2.0;
                   continue;
               }
           } catch (Exception e) {
           }

           // If f is in ]-2.0; -1.0] U [1.0; 2.0[, return the proper answer.
           try {
               return posn[(int) ((f+1.5)/2)];
           } catch (Exception e) {
           }

           // f is outside ]-2.0; 2.0[, divide by 2 and restart.
           f /= 2.0;

       }

   }

   static void check(double f)
   {
       System.out.println(f + " -> " + positive(f));
   }

   public static void main(String args[])
   {
       for (double i = -10.0; i <= 10.0; i++)
           check(i);
       check(-1e24);
       check(-1e-24);
       check(1e-24);
       check(1e24);
   }

Вывод:

-10.0 -> false
-9.0 -> false
-8.0 -> false
-7.0 -> false
-6.0 -> false
-5.0 -> false
-4.0 -> false
-3.0 -> false
-2.0 -> false
-1.0 -> false
0.0 -> true
1.0 -> true
2.0 -> true
3.0 -> true
4.0 -> true
5.0 -> true
6.0 -> true
7.0 -> true
8.0 -> true
9.0 -> true
10.0 -> true
-1.0E24 -> false
-1.0E-24 -> false
1.0E-24 -> true
1.0E24 -> true
0 голосов
/ 22 октября 2010

Напишите его, используя условное выражение, а затем посмотрите на сгенерированный код сборки.

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