dec2base,具有独立的位/数字计算 [英] dec2base with independent bits/digits calculation

查看:79
本文介绍了dec2base,具有独立的位/数字计算的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

需要 MATLAB / 八度音调 dec2base 具有独立位/位计算算法的功能函数(在整数逻辑内,没有除法,使用模算术).

Need MATLAB/Octave dec2base functionality function with independent bits/digits calculation algorithm (within integer logic, with no divisions, using modular arithmetic).

也很高兴:

  1. 匿名函数


注意!标量只能使用一次浮点逻辑和除法来定义转换后的数字数组中的最大位数:


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

  1. 此处列出的简化 dec2bin 案例的解决方案./li>这篇文章中提供的
  2. bitget 解决方案: Matlab/Octave bitget函数任何基础
  1. Solution for simplified dec2bin case listed here.
  2. Solution for bitget provided in this post: Matlab/Octave bitget function for any base

推荐答案

  1. MATLAB/OCTAVE中:

  1. 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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆