转载: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十进制与二进制补码之间的转换相关推荐

  1. matlab复数向极坐标转换_[matlab 极坐标]利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换。谁能写出函数和调用语句?...

    利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换.谁能写出函数和调用语句? 问题补充:利用MATLAB函数文件,实现直角坐标(x,y)与极坐标(ρ,θ)之间的转换.谁能写出 ...

  2. 计算机原理与基础 —— 进制之间的转换(二进制与十、八、十六禁止之间的转换)

    进制也就是进制位,对于接触过电脑的人来说应该都不陌生,我们常用的进制包括:二进制.八进制.十进制与十六进制,它们之间区别在于数运算时是逢几进一位.比如二进制是逢2进一位,十进制也就是我们常用的0-9是 ...

  3. matlab二进制十进制十六进制和任意进制之间的转换

    >> a=bin2dec('1011001')   %将二进制转换为10进制 a = 89 >> b=dec2bin(22)  %将10进制转换为2进制 b = 10110 & ...

  4. 波长波数转换matlab,【求助】请教红外常用波数与波长之间的转换关系...

    大家再请看下面的内容,我提此问题来源于此: Wavelength calculation ------------------------------------------------------- ...

  5. c++十六进制转十进制_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...

    1.背景(Contexts) 之前使用SQL把十进制的整数转换为三十六进制,SQL代码请参考:SQL Server 进制转换函数,其实它是基于二.八.十.十六进制转换的计算公式的,进制之间的转换是很基 ...

  6. bash 将二进制转换为十进制_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...

    1.背景(Contexts) 之前使用SQL把十进制的整数转换为三十六进制,SQL代码请参考:SQL Server 进制转换函数,其实它是基于二.八.十.十六进制转换的计算公式的,进制之间的转换是很基 ...

  7. 二进制转换八进制图解_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...

    1.背景(Contexts)之前使用SQL把十进制的整数转换为三十六进制,SQL代码请参考:SQL Server 进制转换函数,其实它是基于二.八.十.十六进制转换的计算公式的,进制之间的转换是很基础 ...

  8. 二进制、八进制、十进制、十六进制之间的转换(图文解释)

    文章目录 前言 1.二进制 1.1.二进制转八进制 1.2.二进制转十进制 1.2.二进制转十六进制 2.八进制 1.1.八进制转二进制 1.2.八进制转十进制 1.2.八进制转十六进制 3.十进制 ...

  9. matlab 二进制补码转十进制,MATLAB浮点数与定点二进制补码互转算法验证方案

    最近本人一直在学习ZYNQSOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQPS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更新硬 ...

  10. 计算机十进制转为八位二进制,Java将十进制转换为8位二进制(Java convert from decimal to 8-bit binary)...

    Java将十进制转换为8位二进制(Java convert from decimal to 8-bit binary) 我写了简单的java代码来从十进制转换为8位二进制:抱歉这个愚蠢的问题 1 in ...

最新文章

  1. python自带intertool模块找不到_Python itertools模块:生成迭代器(示例分析)
  2. 字节面试官:如何实现Ajax并发请求控制
  3. 工作49:loaction注意
  4. sun-java6-jdk_Ubuntu下安装sun-java6-jdk和eclipse
  5. android db 代码查看工具,Android 真机调试查看db数据库文件
  6. Faulty Robot-(dfs或者dijkstra)
  7. django模型多对一 多对多 一对一三种关系解读
  8. 02. Yii 2.0 框架的目录结构
  9. 百度AI Studio飞桨平台 “深度学习”结课总结
  10. yaml文件 *.yml 写法简介
  11. 花168大洋买来的「阿里P8Java成长笔记」,看完才知道我就是lj
  12. 进程间通信的六大方式
  13. 聊一聊世界杯里的数学知识
  14. 怎么在韩国VPS服务器与虚拟主机中进行选择?
  15. 斗破苍穹java_安卓斗破苍穹游戏源码
  16. 卸载计算机更新程序包,win7系统删除系统更新安装包的详细教程
  17. vue3中使用swiper7
  18. Linux下的Git三板斧
  19. MATLAB程序设计与应用刘卫国(第三版)课后实验答案——13
  20. Unity Animation Miss Path

热门文章

  1. 中控考勤机通过公网添加入异地中控系统
  2. OSChina 周六乱弹 —— 到底谁是小公猫……
  3. UBUNTU之安装软件
  4. 出现This dependency was not found:解决方法,亲测有用
  5. 《杜拉拉升职记3》读书笔记
  6. 关于单精度和双精度实数
  7. Excel插入图片自动OCR识别成可编辑的文字
  8. 杨飞致工管院的朋友们及湖南大学教研同仁的一封信[转]
  9. sniffer是利用计算机的,利用SNIFFER技术侦测局域网中的ARP欺骗及解决方案
  10. Codeforces Round #643 (Div. 2)