matlab 调用 dec2bin() 函数,传入负数就报错,做个笔记吧
1.怎么用?
当数字a大于0的时候,直接调用函数
bin = dec2bin( a, 8 ); % 8 是指变成8位的二进制数,例如 a = 3 ,则 bin 就是 0000_0011
当数字a小于0的时候,这样操作:
bin = dec2bin( a + 2^8 , 8 ); % 8 还是8位的意思,比如 a = -3 ,则 bin 就是 1111_1101
操作一个一维数组的时候就可以这样来
% ===== array 是一个一维数组 ===== %
for i = 1 :length(array )
if(array (i) <0)
array (i) = array (i) + 2^8;
end
end
ans = dec2bin(array , 8 ); %这个函数 可以直接把数组作为参数输入
例子里面的 8 是指位数,如果需要转化成16位的,就把 所有的 8 换成 16 !
2.为什么?
- dec2bin() 函数会把大于0的整数转换成指定位数的二进制字符串,比如把十进制的 3 转化成 8位的二进制就是:
0000_0011
; - 小于0的数转化成二进制,应该是转化成对应正整数的补码( 按位取反 再 + 1),比如3的8位的按位取反就是:
1111_1100
; 为什么要 + 1呢?如果不 + 1,那么0000_0011 + 1111_1100
就会得到1111_1111
,给他加个 1 就变成了1_0000_0000
,如果指定了 8 位 ,那么就会直接抛弃第一个1 ,结果就是0000_0000
,所以这样 按位取反 再 +1 的操作就是为了对应3 + (-3) = = 0
这样的计算结果。 - 有了上面的基础,就可以着手准备利用好dec2bin()函数了;思路就是 把负数 a 的补码( 绝对值的按位取反 再 + 1),对应的 十进制 的 整数 b 找到,完了
dec2bin(b , 8)
;有点绕啊,还是举例子,-3 的 补码是1111_1101
,这个字符串对应的十进制就是 253 ; 而-3 + 2^ 8 == 253
;
power(2,0) + power(2,2)++ power(2,3)+ power(2,4)+ power(2,5)+ power(2,6)+ power(2,7) == 253
结论
正数:直接 dec2bin();
负数:先给负数 加一个 2^n ,然后再用 dec2bin();