MATLAB将值向量转换为uint32

时间:2009-07-14 21:15:36

标签: matlab vector bit-manipulation data-conversion unsigned-integer

我有一个包含值0,1,2和3的向量。我想要做的是从这个向量中抽取的每组16个元素中取下两位,并将它们全部附加在一起得到一个uint32。有人知道一个简单的方法吗?

跟进:如果向量中的元素数不是16的整数倍,该怎么办?

3 个答案:

答案 0 :(得分:6)

这是一个矢量化版本:

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 ]))

答案 1 :(得分:3)

为了改进Jacob在他的answer和他的评论中提出的建议,这里是我能提出的最简洁的版本(给定一个包含值的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)');

答案 2 :(得分:0)

我认为你应该看看bitgetbitshift。它应该是这样的(伪matlab代码,因为我很长时间没有使用Matlab):

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

请注意,这将为您提供最高位中第一个向量的最后几位,因此您可能希望将i从16降为1而不是