问题在于您不能将有符号和无符号算术与整数混合使用。反正不是直接的。你必须具体说明你想要什么。您提到的行给出了零,因为您将默认情况下从to重铸的uint16
表示相乘,该表示截断为零()。改为使用。(-1)
double
uint16
0
int16
我使用一些更好的变量名称制作了更简洁的代码版本(尽管有些人可能不同意)。我发现使用数学意义上的“类型”作为变量名称(矩阵、向量等)的前缀很有用。即使数据结构非常小,您也应该养成预先分配数据的习惯。我敢打赌,MATLAB 编辑器可能会在右边空白处用恼人的警告对你大喊大叫?:)
如果第16 位设置在 的值中,则final
向量(一个向量)现在应该包含二进制补码(负)值。也不知道是干什么用的,所以我把它删了。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
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
希望能帮助到你。