dec2base,具有独立的位/数字计算 [英] dec2base with independent bits/digits calculation
本文介绍了dec2base,具有独立的位/数字计算的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
需要 MATLAB
/ 八度音调
dec2base
具有独立位/位计算算法的功能函数(在整数逻辑内,没有除法,使用模算术).
Need MATLAB
/Octave
dec2base
functionality function with independent bits/digits calculation algorithm (within integer logic, with no divisions, using modular arithmetic).
也很高兴:
- 匿名函数
注意!标量只能使用一次浮点逻辑和除法来定义转换后的数字数组中的最大位数:
NB! floating logic and division could be used only one time for scalar to define the maximal amount of digits in converted numbers array:
ceil( log2(max(dec(:)))/log2(base)) )
PS
- 在此处列出的简化
dec2bin
案例的解决方案./li>这篇文章中提供的 -
bitget
解决方案: Matlab/Octave bitget函数任何基础
- Solution for simplified
dec2bin
case listed here. - Solution for
bitget
provided in this post: Matlab/Octave bitget function for any base
推荐答案
在
MATLAB
/OCTAVE
中:
In
MATLAB
/OCTAVE
:
% For Matlab/Octave:
de2bs = @(dec,base) base.^([(1+floor( log2(max(dec(:)))/log2(base)) ):-1:1]-1); % an array of powers of a base
de2bs = @(dec,base) sum(rem(dec(:) ...
,base.*de2bs(dec,base) ...
) ...
>=permute((1:base-1)'*(de2bs(dec,base)) ...
,[3,2,1] ...
) ...
,3 ...
);
示例:
x=0:9; base=3; de2bs(x,base)
ans =
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
仅在 OCTAVE
中:就Octave支持匿名的默认值而言函数,还有一个更有趣的重载函数实施:
In OCTAVE
only: as far as Octave supports default values for anonymous
functions, there is a more interesting overloaded function
implementation:
% OCTAVE only (Matlab do not support default values for parameters)
% Anonymous function de2bs
% dig = digget(dec, base, isoutputasstring, pos)
% dig - returns the value of the digits in positions (pos) for numbers (dec)
% coverted to the defined base (for base=2 behaves similar to bitget)
% dec - mandatory, initial decimal numbers vector
% base - optional (by default base = 2),
% base to convert (for binary base = 2 )
% isoutputasstring - optional (by default isoutputasstring = true),
% example: de2bs(26,16,0) -> '1A'
% example: de2bs(26,16,1) -> [1 10]%
% pos - optional (by default pos = (ceil( log2(max(dec(:)))/log2(base)) ):-1:1 )
% array of positions (like in bitget function)
de2bs = @(dec
,base = [2] ... % Base of numbers you want to get
,isoutputinstringformat = [true] ... % output format 0/1 - integer/string
,pos = [(ceil( log2(max(dec(:)))/log2(base)) ):-1:1] ... % Bits/digits positions to return (similar to bitget function)
... % temporary variables listed below (NOT parameters) ...
,pbs = [base.^(pos-1)] ... % pbs - powers of base
,num = [sum(rem(dec(:) ... % conversion to defined base
,base.*pbs ...
) ...
>= permute((1:base-1)'*pbs ...
,[3,2,1] ...
) ...
,3 ...
) ...
] ...
) ...
ifelse(isoutputinstringformat ... % Convert digits to chars if necessary
,char(ifelse(num>9,num+55, num+48)) ... % like 9->'9', 10->'A', 11->'B';
,num ...
);
示例:
x=25:28;
base=16;
de2bs(x) % behaves as dec2bin(x)
ans =
11001
11010
11011
11100
de2bs(x,base) % behaves as dec2base(x,base)
ans =
19
1A
1B
1C
de2bs(x,base,0) % behaves as dec2base(x,base) without converting/mapping to string/char format
ans =
1 9
1 10
1 11
1 12
de2bs(x,base,1,[3 2 1]) % behaves as dec2base(x,base), but returns mentioned digits in number (like in bitget function)
ans =
019
01A
01B
01C
这篇关于dec2base,具有独立的位/数字计算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文