目录
一、进制
二、Matlab进制转换的内置函数
N进制转换成十进制
二进制转十进制:bin2dec
八进制转十进制:oct2dec
十六进制转十进制:hex2dec
N进制转十进制:base2dec
十进制转换成N进制
十进制转二进制:dec2bin
十进制转八进制:dec2base
十进制转十六进制:dec2hex
三、进制转换类型(整数)
N进制转换为二进制
十进制转换为二进制
八进制转换为二进制
十六进制转换为二进制
二进制转换为N进制
二进制转换为十进制
二进制转换为八进制
二进制转换为十六进制
N进制转换为M进制
四、进制转换类型(小数)
进制是一种计数法,以十进制为例,即逢十进一。在不同的领域会使用不同的进制存储数据,例如在Dicom图像(Digital Imaging and Communications in Medicine)中则是使用十六进制进行编码,而在读取图像数据进行图像处理的时候,将数据从十六进制还原成十进制可能会方便操作。
MATLAB进制转换内置函数如图,以为例:二进制为,八进制为,十六进制为。
x = bin2dec('11111111')% 在MATLAB中二进制需在数值加上'',或者在数值前加0b表示
x = bin2dec(0b11111111)
输出结果:
x = oct2dec([377]) %在MATLAB中使用此函数时需在八进制数值加上[]
输出结果:
x = hex2dec('FF'); % 和二进制一样,十六进制数值需要加'',或者在数值前加0x
x = hex2dec(0xFF);
% base2dec函数用于其他不常用的进制类型转换成十进制
x = base2dec('FF',16); % 'FF'表示要转换的数值,16表示转换数值的进制类型为十六进制
y = base2dec('1103',6) % 六进制数值1103转换为十进制,结果为255
x = dec2bin(255) % 十进制的数值不需要加符号进行区别,输出结果为x = '11111111'
x = dec2base(255,8) % 没有dec2oct这个函数,所以用通用的dec2base,输出结果为x = '377'
x = dec2hex(255) % 输出结果为'FF'
有时候MATLAB没有我们想要的内置函数,例如没有二进制和八进制相互转换的内置函数,可以通过二进制转换成十进制,再转换成八进制间接实现,也可以自己写函数。同时也能练习编程。
(1)计算方式:除2取余,逆序排列
(2)算法流程图:
(3)代码实现:
function [answer] = D2B(Number)
% This function is used to convert Decmital to Binary 十进制转换为二进制
answer = []; % 初始化答案
while Number >= 1
a = rem(Number,2); % 求除2后的余数
a = int2str(a); % 数值转换为字符串方便计数时倒序操作
answer = strcat(answer,a); % 把余数对应的字符串连接起来
if a == '1'
Number = (Number-1)/2;
else
Number = Number/2;
end
end
answer = reverse(answer); % 计数是倒序的,把字符串顺序倒过来,输出答案
end
(4)验证:与实际结果一致
(1)计算方法:每位数字单独转换成3位二进制,然后组合(2的3次方等于8。与3.2.2对比)
(2)代码实现:
function [answer] = O2B(Number)
% This function is used to convert Octal to Binary 八进制转换为二进制
Ans = [];% 初始化答案
str = num2str(Number); % 将输入的数字转为字符串
number = length(str); % 通过字符串个数判断输入数字的位数;
for i = 1:number
Num = str2double(str(i));
answer = '000'; % 每个八进制数转换为二进制为3位
j = 1;
while Num >= 1
a = rem(Num,2); % 求除2后的余数
a = int2str(a); % 数值转换为字符串方便计数时倒序操作
answer(j) = a; % 保存a
if a == '1'
Num = (Num-1)/2;
else
Num = Num/2;
end
j = j+1;
end
answer = reverse(answer); % 计数是倒序的,把字符串顺序倒过来,输出答案
Ans = strcat(Ans,answer); % 把各个数字转换成的二进制连接起来
end
answer = Ans;
end
(1)计算方法:每位数字/字母单独转换成4位二进制,然后组合(2的4次方等于16。与3.2.3对比)
(2)代码实现:与八进制转换成二进制类似,但是由于十六进制包含字母,需要先将字母转换成对应的数字
function [answer] = H2B(Number)
% This function is used to convert Octal to Binary 十六进制转换为二进制
% 输入变量Number必须为字符串
Ans = [];% 初始化答案
number = length(Number); % 通过字符串个数判断输入数字的位数;
%--------------------------------处理数据----------------------------------
for i = 1:number
if isstrprop(Number(i),'digit') == 1 % 判断单前字符是否为数字
Num = str2double(Number(i));
elseif Number(i) == 'A' % A代表十进制的10
Num = 10;
elseif Number(i) == 'B' % B代表十进制的11
Num = 11;
elseif Number(i) == 'C' % C代表十进制的12
Num = 12;
elseif Number(i) == 'D' % D代表十进制的13
Num = 13;
elseif Number(i) == 'E' % E代表十进制的14
Num = 14;
elseif Number(i) == 'F' % F代表十进制的15
Num = 15;
end
%-------------------------------计算---------------------------------------
answer = '0000'; % 每个八进制数转换为二进制为3位
j = 1;
while Num >= 1
a = rem(Num,2); % 求除2后的余数
a = int2str(a); % 数值转换为字符串方便计数时倒序操作
answer(j) = a; % 保存a
if a == '1'
Num = (Num-1)/2;
else
Num = Num/2;
end
j = j+1;
end
answer = reverse(answer); % 计数是倒序的,把字符串顺序倒过来,输出答案
Ans = strcat(Ans,answer); % 把各个数字转换成的二进制连接起来
end
answer = Ans;
end
(1)计算方式:,其中n表示二进制位数,M = 0或者1
(2)代码实现:
function [answer] = B2D(Number)
% This function is used to convert Binary to Decital 二进制转换为十进制
str = num2str(Number); % 将输入的数字转为字符串
str = reverse(str); % 从2的0次方开始计算,所以是倒序
number = length(str); % 通过字符串个数判断输入数字的位数;
answer = 0;
for i = 1:number
M = str2double(str(i)); % 将提取字符串单个数并转换为double类型,M为0或1
answer = M*2^(i-1)+answer; % 累加
end
end
(1)计算方法:每3位二进制转换为八进制,然后组合(2的3次方等于8。与3.1.2对比)
(2)代码实现:
function [Answer] = B2O(Number)
% This function is used to convert Binary to Octal 二进制转换为十进制
% 逆序每三位分为一组,通过二进制转换为十进制的方式计算每一组,再组合
%--------------------------------分组-------------------------------------
str = num2str(Number); % 将输入的数字转为字符串
str = reverse(str); % 从2的0次方开始计算,所以是倒序
number = length(str); % 通过字符串个数判断输入数字的位数;
a = rem(number,3); % 求除3后的余数
group_num = (number-a)/3; % 计算组数
store_ans = [];
%--------------------------------补0-------------------------------------
% 如果余数不等于0,则是首组不满三位,补0
if a ~= 0
if a == 1
str(end+1) = '0';
else
str(end+1:end+2) = '00';
end
group_num = group_num+1; % 补0后组数加1;
end
%--------------------------------计算-------------------------------------
% 其他组都是三位,不需要特殊处理,所以用循环就行
for k = 1:group_num
group = str(k*3-2:k*3);
answer = 0;
for i = 1:3
M = str2double(group(i)); % 将提取字符串单个数并转换为double类型,M为0或1
answer = M*2^(i-1)+answer; % 累加
end
answer = num2str(answer); % 把结果先转换成字符串,方便组合
store_ans = strcat(store_ans,answer);
end
store_ans = reverse(store_ans); % 把后面的组逆序转为顺序组合
Answer = str2double(store_ans); % 把结果转换为数字类型
end
(1)计算方法:每4位二进制转换为八进制,然后组合(2的4次方等于16。与3.1.3对比)
(2)代码实现:与二进制转换为八进制思路相似,逆序将4位分为1组,首组不足4位则补0;将计算结果10-15对应A-F,结果用字符串输出。
通过间接转换实现,现将N进制转换为二进制,再转换为M进制;或者先将N进制转换为十进制,再将十进制转换为M进制。
整数的进制转换可用MATLAB内置函数快速实现,而自己写函数可以加深对进制转换计算方法的理解。有时候MATLAB没有能够实现我们想要的功能的函数,这就需要自己实现,在平时多锻炼自己的编程思维。另,小数的转换我没有找到相关的内置函数,欢迎补充~
实现小数进制转换待续......