Побитовое абсолютное значение - PullRequest
1 голос
/ 25 мая 2011

Если бы я хотел найти абсолютное значение 24-битного целого числа с дополнением до двух, лучше ли было бы замаскировать целое число и, если необходимо, отменить исходное число?

public static int bitwiseAbsoluteValue(int n) {
      if (n == 0x800000) {
           return 0x000000;
      } else {
           if ((n & 0x800000) == 0x800000) {
                 return (~n + 1) & 0x7FFFFF;
           } else {
                 return n;
           }
      }
}

Будет ли это работать?

Ответы [ 5 ]

2 голосов
/ 25 мая 2011

Вам также необходимо замаскировать первое возвращаемое значение:

return (~num + 1) & 0x7FFFFF;

И вам нужно будет решить, что вы хотите сделать, если переданное значение равно 0x800000.Текущая функция вернет 0, что, очевидно, неверно.

0 голосов
/ 25 мая 2011

Сдвиньте влево на 8 бит, затем снова сдвиньте вправо на 8 бит (арифметическое, а не логическое смещение) Это будет правильно распространять знак, если он есть.

0 голосов
/ 25 мая 2011

Это будет работать.Хотя вы можете хранить только до +127 и до минус -128.Таким образом, отрицание -128 плюс 1 будет отрицательным числом.С этим ничего не поделаешь, если возвращаемое число также должно быть 24-битным.

Извините, замените +127 и -128 на самые большие положительные и отрицательные числа, которые можно сохранить с 24-bits.Они предназначены для иллюстрации того, что в дополнении 2 вы можете хранить отрицательное число, которое имеет абсолютное значение на 1 больше, чем наибольшее положительное число, которое вы можете сохранить.Поэтому вам нужно выяснить, как вы хотите с этим справиться, если номер, который вы указали, является наибольшим отрицательным числом (0x80000000 в дополнении 2).

0 голосов
/ 25 мая 2011

Вы можете просто вычесть его из 0x1000000 (что составляет 1 << 24), если установлен бит 23. </p>

0 голосов
/ 25 мая 2011

Ну, один из способов сделать это без Math.abs(n) будет примерно так:

public static int findAbs(int n){
  if(n<0){return -1*n;}
  return n;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...