2011-05-25 4 views
1

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

Чтобы лучше проиллюстрировать, что я имею в виду:

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

эту работу?

+0

Хм, что случилось с 'Math.abs (n)'? –

ответ

2

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

return (~num + 1) & 0x7FFFFF; 

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

+0

Не могли бы вы объяснить, пожалуйста? Я не следую за маскирующей частью ... –

+0

Я предполагаю, что n - это 32-битный int, который вы используете для хранения вашего 24-битного значения. Если вы храните, скажем, '-4' как' 0x00FFFFFC', то без маски вы получите 0xFF000004. Просто зависит от того, как вы обрабатываете высокие биты, которые вы не используете в другом месте вашего кода. –

+0

Хорошо, я изменил исходный код выше, чтобы он отражал ваше предложение и, похоже, работает. Большое спасибо! –

0

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

public static int findAbs(int n){ 
    if(n<0){return -1*n;} 
    return n; 
} 
+0

Это не удовлетворяет требованиям OP для 24-битных, поскольку по умолчанию int в Java 32 бит. –

+0

Это, вероятно, будет медленнее, чем бит-мудрый ops. –

+0

Я в основном работал с комментарием OP _ «Мне любопытно узнать, как это делается без использования встроенных функций». _ – Vap0r

0

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

0

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

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

+0

то, что вы описываете, является 8-битным числом. 24-битное целое число со знаком может хранить -2^23 до 2^23-1. 2^23 - 8 388 608. – Adam

+0

btw, '~ num' не является отрицанием, это бит-дополнение. Возможно, вам захочется посмотреть, что означает два дополнения. – Adam

+0

К сожалению, я хотел использовать 8-битные числа в качестве примера того, как номера дополнений 2 могут хранить еще 1 отрицательное число, чем положительные числа. И я знаю, что такое дополнение 2, но я вижу, как это выглядит так, как будто я этого не делаю. – Ryan

0

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

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