2015-08-17 2 views
2

Я новичок в байтах и ​​битах, и я тоже не очень хорош в математике. Я как бы понимаю поразрядные операторы, но я не знаю, как решать математические уравнения/формулы с двумя переменными. Я не уверен, что это подходящее место, чтобы спросить об этом, но так или иначе.Сложная формула

У меня есть формула, как это:

(Adr_MSB & 0x3F) << (8 + Adr_LSB) 

Теперь то, что я хочу, что я хотел бы получить целое число (например, 33) и код превратит его в Adr_MSB и Adr_LSB (которые являются байт). Он должен работать до 128 (нормально, я думаю, это будет 127).

Я знаю, что этот вопрос может звучать глупо или что-то в этом роде, но я просто не знаю достаточно математики, чтобы решить эту проблему.

Спасибо за помощь.

EDIT: экспериментально я понял, что Adr_MSB является множителем (например, если его 10 в 10 раз больше, чем если он равен 1).

+0

Связанный: http://stackoverflow.com/questions/7199625/mathematics-equation-for-and-bitwise-operation –

+0

Это вопрос программирования? Вы, возможно, ищете http://math.stackexchange.com/? – tnw

+0

Да, я думал, что это IDK, если это подходящее место. Но поскольку он содержит побитовые операторы, я считаю, что это подходящее место. – grizeldi

ответ

0

Представляет собой следующие цели:

((Adr_MSB & 0x3F) < < 8) | Adr_LSB

+0

Нет, мне нужно сказать что-то вроде: 1 = (Adr_MSB & 0x3F) << (8 + Adr_LSB) И затем вычислить оба байта. – grizeldi

0

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

int x = 33; 
byte Adr_MSB = (byte)x; 
byte Adr_LSB = (byte)24; 
System.out.println((Adr_MSB & 0x3F) << (8 + Adr_LSB)); 

Adr_LSB также может быть -8.

Поскольку вы побитовы и на Adr_MSB и 111111, у вас есть только шесть последовательных битов, доступных для представления числа, поэтому не все целые числа можно представить, просто сдвинув эти 6 бит. Это решение работает для x до enter image description here, поэтому ... вы можете утверждать, что это нехорошее решение, но это начало.

+0

Протестировано, и оно работает до 63. Для моих нужд я думаю, что этого будет более чем достаточно. – grizeldi

+0

Я буду использовать это сейчас, но если какой-нибудь гениальный придумает что-то лучшее, я буду счастлив;) – grizeldi

+0

Вы просто разряжаете левую смену, используя 32 (то же самое, что и подавать нуль). Очевидно, что никакое число, имеющее 1 бит, разделенное более чем на 7 мест, может быть представлено в форме OP. OTOH любое расстояние сдвига может быть достигнуто за счет использования семантики modulo-32, которую использует Java. –

1

Из того, что я понимаю

  • (Adr_MSB & 0x3F) часть дублями последние шесть битов из Adr_MSB и возвращает соответствующие целое.
    • Например: 125 (1111101) возвращает 61 (111101)
    • Примечания: Этот шаг удаляет все, кроме последних 6 битых бит, эти биты теряются. Следовательно, обратная функция без потерь невозможна.
  • (8 + Adr_LSB) только добавляет 8 до Adr_LSB.
  • << - это немного мудрый левый оператор смены.
    • Например. 61 << 3 = 488. Поскольку 61 равно 111101, добавив три нуля вправо (Left Shifting три раза), вы получите 111101000, что равно 488.

Эффективная обратная выражения (Adr_MSB & 0x3F) << (8 + Adr_LSB) быть применены к заданному числу x

  1. Возьмите первые шесть битов из x и преобразовать его в целое. Это будет Adr_MSB.
  2. Подсчитайте остальную часть бит. Вычитайте 8 из этого числа, и оно будет Adr_LSB.
+0

Я попробую это завтра, на сегодня я закончил с кодированием. – grizeldi

+0

Это все правильно, но выполнение подсчета и даже просто поиск первого 1-битного будет проблемой. –

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