Операция вращения бита - PullRequest
       0

Операция вращения бита

2 голосов
/ 22 февраля 2011

Есть ли способ сделать операцию вращения битов обратимой? Я имею в виду, что если есть изображение X (размер 256 * 256 * 3), то при выполнении поворота битов получается изображение Y. Затем, подвергнув Y вращению бита, мы получаем изображение X. Также, Как справиться с переполнением бита, чтобы не было потери информации.

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

ОБНОВЛЕНИЕ: Я взял размещенный ниже код и усовершенствовал его до полной функции с проверкой ошибок, справочной документацией и возможностью работать с массивами неподписанных целые числа и переменные двойной точности, как и встроенная функция BITSHIFT . Я предлагаю использовать более новую версию, на которую я ссылаюсь выше, вместо более старой версии, опубликованной ниже.


MATLAB не имеет встроенной функции вращения битов, а функция BITSHIFT будет сбрасывать биты, которые переполняются. Тем не менее, вы можете реализовать свою собственную функцию поворота битов на основе существующих битовых операций . Вот простая версия первого прохода, которую я скинул (без проверки ошибок):

function data = bit_rotate(data,nBits)
  dataBits = log2(double(intmax(class(data)))+1);  %# Number of bits in data
  nBits = rem(nBits,dataBits);  %# No need to rotate by dataBits bits or more
  if nBits == 0  %# No bit rotation needed, just return
    return
  end
  shiftedData = bitshift(data,nBits);              %# Bit shift the data
  lostData = bitxor(data,bitshift(shiftedData,-nBits));  %# Find the lost bits
  rotatedData = bitshift(lostData,nBits-sign(nBits)*dataBits);  %# Rotate them
  data = shiftedData+rotatedData;  %# Add the rotated bits to the shifted bits
end

А вот некоторые тестовые данные:

>> B = uint8(208);     %# An unsigned 8-bit integer value
>> disp(dec2bin(B,8))  %# Display the bit pattern of B
11010000
>> disp(dec2bin(bit_rotate(B,2),8))   %# Rotate left by 2 bits
01000011
>> disp(dec2bin(bit_rotate(B,-2),8))  %# Rotate right by 2 bits
00110100

Обратите внимание, что bit_rotate также будет работать с матричным входом любого размера для data, пока это целочисленный тип без знака.

0 голосов
/ 22 февраля 2011

Конечно, ротация битов обратима, просто поверните в обратном направлении на ту же величину.

В Википедии есть хорошая информация о том, как реализовать ее в C с базовыми сдвигами битов, чтобы избежать переполнения.: http://en.wikipedia.org/wiki/Circular_shift

И я полагаю, что если в Matlab операция называется «вращением бита», то она точно не переполнится.

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