我有一个包含值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在他的评论中,这是我可以提出的最简洁的版本 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. 。应该有可能成为这样的事情(伪马tlab代码,因为我很长一段时间都没有与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