問題は、符号付きおよび符号なしの算術演算を整数と混在させることができないという事実から生じます。とにかく直接ではありません。何が欲しいかを具体的に伝える必要があります。あなたが言及した行は、デフォルトで から にリキャストされ、ゼロに切り捨てられるuint16
表現を乗算するため、ゼロになります( )。代わりに使用してください。(-1)
double
uint16
0
int16
いくつかのより良い変数名を使用して、コードのよりクリーンなバージョンを作成しました (同意しない人もいるかもしれませんが)。数学的に意図された「型」を変数名 (行列、ベクトルなど) の接頭辞として使用すると便利です。また、データ構造が非常に小さい場合でも、データを事前に割り当てる習慣を身に付ける必要があります。MATLAB エディターが右マージンに迷惑な警告を表示して、あなたに怒鳴りつけているのではないでしょうか? :)
の値で 16 番目のビットが設定されている場合、final
ベクトル (int16
ベクトル) には 2 の補数 (負) の値が含まれている必要があります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
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
それが役に立てば幸い。