Вопрос

У меня есть вектор, содержащий значения 0, 1, 2 и 3. То, что я хочу сделать, это взять два нижних бита из каждого набора из 16 элементов, взятых из этого вектора, и добавить их все вместе, чтобы получить один Uint32. Кто -нибудь знает простой способ сделать это?

Последующее наблюдение: Что, если количество элементов в векторе не целое число из 16?

Это было полезно?

Решение

Вот векторизованная версия:

v = floor(rand(64,1)*4);
nWord = size(v,1)/16;
sum(reshape([bitget(v,2) bitget(v,1)]',[32 nWord]).*repmat(2.^(31:(-1):0)',[1 nWord ]))

Другие советы

Уточнить то, что был предложил Джейкоб в его отвечать И MTRW в его комментарии, вот самая лаконичная версия, которую я могу придумать (учитывая переменную 1 на N vec содержащий значения от 0 до 3):

value = uint32(vec(1:16)*4.^(0:15)');

Это рассматривает первый элемент в массиве как наименее значительный бит в результате. Чтобы рассматривать первый элемент как наиболее значимый бит, используйте следующее:

value = uint32(vec(16:-1:1)*4.^(0:15)');

РЕДАКТИРОВАТЬ: Это касается нового пересмотра вопроса ...

Если количество элементов в вашем векторе не кратно 16, то последняя серия чисел, которые вы извлекаете из него, будет иметь менее 16 значений. Скорее всего, вы захотите подумать о более высоких кусочках серии с нулями, чтобы сделать его вектором из 16 элементов. В зависимости от того, является ли первый элемент в серии наименее знаменитым битом (LSB) или наиболее значимым битом (MSB), вы в конечном итоге наполните серию по-разному:

v = [2 3 1 1 3 1 2 2];  % A sample 8-element vector
v = [v zeros(1,8)];  % If v(1) is the LSB, set the higher bits to zero
% or...
v = [zeros(1,8) v];  % If v(1) is the MSB, again set the higher bits to zero

Если вы хотите обработать весь вектор одновременно, вот как вы это сделаете (с любым необходимым включенным нулевым прибором) для случая, когда vec(1) LSB:

nValues = numel(vec);
nRem = rem(nValues,16);
vec = [vec(:) zeros(1,nRem)];  % Pad with zeroes
vec = reshape(vec,16,[])';  % Reshape to an N-by-16 matrix
values = uint32(vec*4.^(0:15)');

и когда vec(1) MSB:

nValues = numel(vec);
nRem = rem(nValues,16);
vec = [vec(1:(nValues-nRem)) zeros(1,nRem) ...
       vec((nValues-nRem+1):nValues)];  % Pad with zeroes
vec = reshape(vec,16,[])';  % Reshape to an N-by-16 matrix
values = uint32(fliplr(vec)*4.^(0:15)');

Я думаю, ты должен взглянуть на Bitget а также бит -смещение. Анкет Должно быть что-то вроде этого (код псевдо-матлаба, так как я не работал с Matlab в течение долгого времени):

result = 0;
for i = 1:16 do
  result += bitshift(bitget(vector(i), 2:-1:1), 2);

Обратите внимание, что это даст вам последние биты первого вектора в самых высоких битах, так что вы, возможно, захотите спуститься с 16 до 1 вместо этого

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top