// final(i)= - 1 * A2(i);
这是我面临问题的地方。
虽然在任何迭代中A2都不是0,但在决赛中我仍然得到0。
这些只是d的十个值,只是为了说明我正在处理的是什么类型的值。
d=[63820
63594
63382
63123
62921
62712
62536
62350
62129
61914
61668];
d=bin2dec(b);
a=bitget(d,16);
for i=1:10
if (a(i)==1)
C1(i)=bitcmp(uint16(d(i)));
A1(i)=C1(i)+1;
A2=A1';
final(i)=-1*A2(i);
else
final(i)=d(i);
end
end
我在代码的另一部分乘以-1,并没有给出任何问题。请提出你的建议。
答案 0 :(得分:4)
问题来自于你不能将有符号和无符号的arithemetics与整数混合。反正不是直接的。你必须具体告诉你想要什么。您提及的行为零,因为您将uint16
表示与(-1)
相乘,默认情况下从double
重新转换为uint16
,其截断为零(0
)。请改用int16
。
我使用一些更好的变量名称制作了更干净的代码版本(尽管有些人可能不同意)。我发现使用数学上预期的“类型”作为变量名称(矩阵,向量等)的前缀很有用。即使数据结构非常小,您也应该养成预分配数据的习惯。我敢打赌,MATLAB编辑器可能会在右边缘发出恼人的警告,尖叫着你? :)
如果在final
的值中设置了第16位,int16
向量(vec_d
向量)现在应该包含两个补码(负)值。还不确定A2
是什么,所以我删除了它。
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vec_d = [
63820
63594
63382
63123
62921
62712
62536
62350
62129
61914
61668
];
vec_d = uint16(vec_d);
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% extract 16th bit:
vec_a = bitget(vec_d, 16);
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% preallocate other datastructures:
vec_C1 = zeros(size(vec_a), 'uint16');
vec_A1 = zeros(size(vec_a), 'uint16');
vec_final = zeros(size(vec_a), 'int16');
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
for num_k = 1:numel(vec_a)
if (vec_a(num_k) == 1)
vec_C1(num_k) = bitcmp(uint16(vec_d(num_k)));
vec_A1(num_k) = vec_C1(num_k) + 1;
vec_final(num_k) = (-1) * int16(vec_A1(num_k));
else
vec_final(num_k) = vec_d(num_k);
end
end
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
希望它有所帮助。