1

// 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,它没有给出任何问题。请提出您的建议。

4

1 回答 1

4

问题在于您不能将有符号和无符号算术与整数混合使用。反正不是直接的。你必须具体说明你想要什么。您提到的行给出了零,因为您将默认情况下从to重铸的uint16表示相乘,该表示截断为零()。改为使用。(-1)doubleuint160int16

我使用一些更好的变量名称制作了更简洁的代码版本(尽管有些人可能不同意)。我发现使用数学意义上的“类型”作为变量名称(矩阵、向量等)的前缀很有用。即使数据结构非常小,您也应该养成预先分配数据的习惯。我敢打赌,MATLAB 编辑器可能会在右边空白处用恼人的警告对你大喊大叫?:)

如果第16 位设置在 的值中,则final向量(一个向量)现在应该包含二进制补码(负)值。也不知道是干什么用的,所以我把它删了。int16vec_dA2

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

希望能帮助到你。

于 2012-06-24T12:24:40.823 回答