質問

値0、1、2、および3を含むベクトルがあります。私がやりたいのは、このベクトルから描かれた16の要素の各セットから2ビットを2ビットして、それらをすべて追加して1つの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 x-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)');

私はあなたが見るべきだと思います ビットゲットビットシフト. 。このようなものになることは可能であるはずです(Matlabと長い間働いていないので、Pseudo-Matlabコード):

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

これにより、最高のビットの最初のベクトルの最後のビットが得られることに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top