十六进制数转八进制(禁用函数),提示:可以先将十六进制数转换成某进制数,再由某进制数转换成八进制。
0-0000
1-0001
2-0010
3-0011
4-0100
5-0101
6-0110
7-0111
8-1000
9-1001
a-1010
b-1011
c-1100
d-1101
e-1110
f-1111
按这个遍历把16进制转换二进制,然后三个一组合就是八进制
你好,先转换成10进制,再转化成八进制
a = '123A';
% 先转10进制数
a = upper(a);
p = a<='9' & a>='0';
b = double(a);
b(p) = b(p) - double('0');
b(~p) = b(~p) - double('A') +10;
s = 0;
for i = length(b):-1:1
s = s + 16^(length(b)-i)*b(i);
end
% 再转化成八进制数
t = [];
while(s~=0)
q = mod(s,8);
s = (s-q)/8;
t = [q, t];
end
t = char(t+'0')
本例中的结果为
t =
'11072'
function res=bin2tri(msg)
%进制转换程序
%Inputs
%%% msgLen : 需要转换的数据位数
%Outputs
%%% res : 求解的余数矩阵,也就是求解后的存放结果的矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 算法原理 %
% 数字较小的时候可以采取除k取余的方法 %
% 数字位数较大的时候需要模拟除法的原理来进行计算求解 %
% 本算法中一律采用大数求解法 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 例子 %
% (1001)2=(100)3 %
%第一次 %
%1001/3,从千位开始求解。千位:1/3=0,余数为1 %
% 百位:(1*2)/3=0,余数为2 %
% 十位:(2*2)/3=1,余数为1 %
% 个位:(1*2+1)/3=1,余数为0 %
%第二次 %
%11/3,从十位开始。 十位:1/3=0,余数为1 %
% 个位:(1*2=1)/3=1,余数为0 %
%第三次 %
%1/3,从个位开始。 个位:1/3=0,余数为1 %
%第四次 %
%0/3,结束 %
%逆序取结果,得到100(最终余数) %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% msg=[1 0 0 1];
% msg=randint(1,msgLen);
%原始进制
oldbase=2;
%新进制
newbase=3;
% 验证结果正确性
% old=0;
% new=0;
% 求oldbase进制对应的值
% for i=1:size(msg,2)
% old=old*oldbase+msg(i);
% end
%退出条件,被除数位数为0表示求解结束
%余数个数累加
j=1;
while 0~=size(msg,2)
temp=0;
i=1;
%赋值msg
n=1;
%去除ansout中的前置零
m=1;
%从最高位逐位求解,模拟除法过程
while i<=size(msg,2)
temp=temp*oldbase+msg(i);
%此处需特别注意matlab求解除法得到的不是int型,需使用fix函数
ansout(i)=fix(temp/newbase);
temp=mod(temp,newbase);
i=i+1;
end
%保存余数
res(j)=temp;
j=j+1;
while m<=size(ansout,2) && ansout(m)==0
m=m+1;
end
%消息清零,重新赋值,便于重复上述操作
msg=[];
for i=m:size(ansout,2)
msg(n)=ansout(i);
n=n+1;
end
ansout=[];
end
res=rot90(res,2);
% 求newbase对应的值
% for i=1:size(res,2)
% new=new*newbase+res(i);
% end
end
matlab ,可以。
第一步,
十六进制转换为十进制,在命令行窗口中输入hex2dec() 函数。
第二步,
十进制转换为八进制,在命令行窗口中输入dec2base(x,8)