matlab 二进制补码转十进制,matlab十进制与二进制补码之间的转换
转载:http://blog.xdnice.com/blog40543i59178.html
matlab提供了一个系统函数dec2bin,可以用来进行十进制数的二进制转换,不过功能有限!
在matlab中键入 help dec2bin,如下:
DEC2BIN Convert decimal integer to a binary string.
DEC2BIN(D) returns the binary representation of D as a string.
D must be a non-negative integer smaller than 2^52.
DEC2BIN(D,N) produces a binary representation with at least
N bits.
Example
dec2bin(23) returns '10111'
可见,这个函数只能转换整数,对非整数就无能为力了.因此,自己编写了matlab小程序,顺便也贴出来,希望对需要的人能有所帮助!^_^
1.小数转换为二进制数
输入参数有2个,一个是输入的小数(小于1),一个是指定转换后的二进制位数!程序源码如下:
y=dectobin(innum,N)
%十进制小数转换为二进制数
%输入参数为innum和N
%innum为输入的十进制小数
%N为指定转换后二进制的位数
if (innum>1)|(N == 0)%判断输入的有效性
disp('error!');
return;
end
count=0;
tempnum=innum;
record=zeros(1,N);
while(N)
count=count+1;%长度小于N
if(count>N)
N=0;
% return;
end
tempnum=tempnum*2;%小数转换为二进制,乘2取整
if tempnum>1
record(count)=1;
tempnum=tempnum-1;
elseif(tempnum==1)
record(count)=1;
N=0;%stop loop
else
record(count)=0;
end
end
y=record;
2.如果要转换整数,则直接调用matlab的dec2bin即可!
3.对于大于1的非整数,可以利用将其分为整数部分和小数部分的方法来处理:
利用matlab的floor函数可以对输入的数(设为innum)向下取整,然后利用innum-floor(innum)就可以得到小数部分,调用上面的函数就可以得到其二进制表达式!
注意,这里有一个小问题,就是dec2bin函数的返回值是一个char array,所以,我们应该先将其转换为double array!可以利用double()进行强制类型转换,得到ASCII码值,减去48就可以得到double array类型的0,1序列!
程序代码如下:
[num,numint,numf]=dectobin1(innum,N)
%十进制数转换为二进制数
%输入为十进制数innum,以及小数部分的位数N
%输出为三个参数num,numint,numf
%num为输出的二进制形式
%numint为整数部分的二进制表达式
%numf为小数部分的二进制表达式
sep=5;%整数和小数部分的分隔符
if(mod(innum,1)==0)%判断输入是否为整数,mod为取余函数
numint=dec2bin(innum);
numint=double(numint)-48;
numf=zeros(1,N);
num=[numint,sep,numf];
return
end;
%输入为非整数的情况
nint=floor(innum);%整数部分
nf=innum-nint;%小数部分
res_nint=dec2bin(nint);
res_nint=double(res_nint)-48;
res_nf=dectobin(nf,N);
numint=res_nint;
numf=res_nf;
num=[numint,sep,numf];
其中的dectobin函数就是最上面的小数转二进制函数!
4.似乎已经大功告成了,是吗?NO,还有一个问题,那就是负数的情况,在这里,我们采用补码的方式,如果输入为正,则二进制表达式不变,如果为负,则按位取反并加1.因此,需要对上面的函数加上一个负数判断以及补码转换的功能.最终的表示结果可以采用1QN的格式.补码转换部分程序如下:
[numo,numinto,numfo]=conv(numint,numf,flag)
%二进制数的补码表示
%输入参数为numint整数部分的二进制表达式,numf小数部分二进制表达式,flag负数标志
%输出参数为numo输入的补码,numinto整数部分的补码,numfo小数部分的补码
if (flag==0)
numo=[0,numint,5,numf];%正数
numinto=numint;
numfo=numf;
else%负数,整数和小数部分均进行按位取反并加一
l1=length(numint);
l2=length(numf);
num=[numint,numf];
l=l1+l2;
for i=1:l
if num(i)==1%按位取反
num(i)=0;
else
num(i)=1;
end
end
%取反后加一
temp_l=l;
while(temp_l~=0)
if num(temp_l)==0%最低位为0
num(temp_l)=1;
temp_l=0;%结束循环
else
num(temp_l)=0;
temp_l=temp_l-1;
end
end
% l1=length(numint);
% for i=1:l1
%
% if numint(i)==1%按位取反
% numint(i)=0;
% else
% numint(i)=1;
% end
%
% end
%
% l2=length(numf);
% for i=1:l2
%
% if numf(i)==1%按位取反
% numf(i)=0;
% else
% numf(i)=1;
% end
%
% end
%
% %取反后加一
% temp_l1=l1;
% while(temp_l1~=0)
% if numint(temp_l1)==0%最低位为0
% numint(temp_l1)=1;
% temp_l1=0;%结束循环
% else
% numint(temp_l1)=0;
% temp_l1=temp_l1-1;
% end
% end
%
% %取反后加一
% temp_l2=l2;
% while(temp_l2~=0)
% if numf(temp_l2)==0%最低位为0
% numf(temp_l2)=1;
% temp_l2=0;%结束循环
% else
% numf(temp_l2)=0;
% temp_l2=temp_l2-1;
% end
numinto=num(1:l1);
numfo=num(l1+1:l);
% numinto=numint;
% numfo=numf;
numo=[1,numinto,5,numfo];
end
5.最后,用一个main函数连接以上的子函数
[numo,numinto,numfo]=decimal2bin(innum,N)
[num1,numint1,numf1,flag1]=dectobin1(innum,N);
[numo,numinto,numfo]=conv(numint1,numf1,flag1)
matlab 二进制补码转十进制,matlab十进制与二进制补码之间的转换相关推荐
- matlab复数向极坐标转换_[matlab 极坐标]利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。谁能写出函数和调用语句?...
利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换.谁能写出函数和调用语句? 问题补充:利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换.谁能写出 ...
- 计算机原理与基础 —— 进制之间的转换(二进制与十、八、十六禁止之间的转换)
进制也就是进制位,对于接触过电脑的人来说应该都不陌生,我们常用的进制包括:二进制.八进制.十进制与十六进制,它们之间区别在于数运算时是逢几进一位.比如二进制是逢2进一位,十进制也就是我们常用的0-9是 ...
- matlab二进制十进制十六进制和任意进制之间的转换
>> a=bin2dec('1011001') %将二进制转换为10进制 a = 89 >> b=dec2bin(22) %将10进制转换为2进制 b = 10110 & ...
- 波长波数转换matlab,【求助】请教红外常用波数与波长之间的转换关系...
大家再请看下面的内容,我提此问题来源于此: Wavelength calculation ------------------------------------------------------- ...
- c++十六进制转十进制_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...
1.背景(Contexts) 之前使用SQL把十进制的整数转换为三十六进制,SQL代码请参考:SQL Server 进制转换函数,其实它是基于二.八.十.十六进制转换的计算公式的,进制之间的转换是很基 ...
- bash 将二进制转换为十进制_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...
1.背景(Contexts) 之前使用SQL把十进制的整数转换为三十六进制,SQL代码请参考:SQL Server 进制转换函数,其实它是基于二.八.十.十六进制转换的计算公式的,进制之间的转换是很基 ...
- 二进制转换八进制图解_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...
1.背景(Contexts)之前使用SQL把十进制的整数转换为三十六进制,SQL代码请参考:SQL Server 进制转换函数,其实它是基于二.八.十.十六进制转换的计算公式的,进制之间的转换是很基础 ...
- 二进制、八进制、十进制、十六进制之间的转换(图文解释)
文章目录 前言 1.二进制 1.1.二进制转八进制 1.2.二进制转十进制 1.2.二进制转十六进制 2.八进制 1.1.八进制转二进制 1.2.八进制转十进制 1.2.八进制转十六进制 3.十进制 ...
- matlab 二进制补码转十进制,MATLAB浮点数与定点二进制补码互转算法验证方案
最近本人一直在学习ZYNQSOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQPS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更新硬 ...
- 计算机十进制转为八位二进制,Java将十进制转换为8位二进制(Java convert from decimal to 8-bit binary)...
Java将十进制转换为8位二进制(Java convert from decimal to 8-bit binary) 我写了简单的java代码来从十进制转换为8位二进制:抱歉这个愚蠢的问题 1 in ...
最新文章
- python自带intertool模块找不到_Python itertools模块:生成迭代器(示例分析)
- 字节面试官:如何实现Ajax并发请求控制
- 工作49:loaction注意
- sun-java6-jdk_Ubuntu下安装sun-java6-jdk和eclipse
- android db 代码查看工具,Android 真机调试查看db数据库文件
- Faulty Robot-(dfs或者dijkstra)
- django模型多对一 多对多 一对一三种关系解读
- 02. Yii 2.0 框架的目录结构
- 百度AI Studio飞桨平台 “深度学习”结课总结
- yaml文件 *.yml 写法简介
- 花168大洋买来的「阿里P8Java成长笔记」,看完才知道我就是lj
- 进程间通信的六大方式
- 聊一聊世界杯里的数学知识
- 怎么在韩国VPS服务器与虚拟主机中进行选择?
- 斗破苍穹java_安卓斗破苍穹游戏源码
- 卸载计算机更新程序包,win7系统删除系统更新安装包的详细教程
- vue3中使用swiper7
- Linux下的Git三板斧
- MATLAB程序设计与应用刘卫国(第三版)课后实验答案——13
- Unity Animation Miss Path