Побитовые операции обмена - PullRequest
0 голосов
/ 17 ноября 2011

Как обменять биты заданного целого числа {p, p+1, ..., p+k-1} с {q, q+1, ..., q+k-1} в случае, когда у нас есть перекрытие обоих битовых интервалов; p и q - позиции бита:
p != q; k > 1.

Пример:

p = 5;
q = 8;
k = 6;
16-bits decimal number 30 000 in binary representation:
01110101 00110000
================before exchange============
     101 001
  110101
================after exchange==============
     110 101
  101001
============================================

Как определить для битовых позиций 8, 9 и 10, какие биты поставить - 110 или 001?

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Алгоритм, если он допускает перекрытия, должен быть с потерями.

Из вашего примера:

01110101 00110000
     |     |
     101 001
  |    |
  110101

Если вы меняете их местами, значения:

01110101 00110000
     |     |
     110 101
     *** - Mismatch!
  |    |
  101001
     *** - Mismatch!

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

Два способа решения этой проблемы:

  • Документируйте, что ваша функция с потерями, и что вы не можете гарантировать, что вы сможете извлечь замененные биты обратно.
    Мне не нравится эта идея, потому что я не знаю, что бы я использовал такойалгоритм для
  • Бросьте исключение, если в алгоритм введено перекрытие, и напишите свою программу, которая использует этот алгоритм таким образом, чтобы он не генерировал перекрытия.
1 голос
/ 17 ноября 2011

В Java вы можете проверить необходимый бит, используя:

boolean isSet(byte number, int index) {
    return (number & (1 << index)) != 0;
}

Для создания нового байта вы можете использовать: Byte.valueOf (string, radix)

Также, когда вы работаете с не-байтовые числа, вы можете изменить порядок байтов, используя ByteBuffer (ByteOrder.LITTLE_ENDIAN / ByteOrder.BIG_ENDIAN)

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