سؤال

لدي متجه يحتوي على القيم 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 by-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)');

أعتقد أنه يجب أن يكون لديك نظرة على بات و bitshift.. وبعد يجب أن يكون من الممكن أن نكون شيء مثل هذا (رمز ماتلاب الزائفي لأنني لم أعمل مع 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