具有独立位/位数计算的 dec2base

如何解决具有独立位/位数计算的 dec2base

需要MATLAB/Octave dec2base 具有独立位/位数计算算法的功能函数(在整数逻辑中,没有除法,使用模算术)。

也很高兴:

  1. 匿名函数

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

ceil( log2(max(dec(:)))/log2(base)) )

附言

  1. 针对简化的dec2bin 案例列出的解决方案 here
  2. 这篇博文中提供的 bitget 的解决方案:Matlab/Octave bitget function for any base

解决方法

  1. 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
    
  2. 仅在 OCTAVE 中:只要 Octave 支持匿名的默认值 函数,还有一个更有趣的重载函数 实施:

    % 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,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                       ...,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,0) % behaves as dec2base(x,base) without converting/mapping to string/char format
    
    ans =
    
    1    9
    1   10
    1   11
    1   12
    
    
    de2bs(x,1,[3 2 1])   % behaves as dec2base(x,base),but returns mentioned digits in number (like in bitget function)
    
    ans =
    
    019
    01A
    01B
    01C
    
,

如果您需要它作为常规函数(需要具有 Compatible Array Sizes for Basic Operations 支持的 MatLab 版本):

function dig = de2bs(dec,isoutputnumerical,pos) 
% de2bs(D)
% de2bs(D,BASE)
% de2bs(D,BASE,ISOUTPUTNUMERICAL)  
% de2bs(D,ISOUTPUTNUMERICAL,POS)
%
% de2bs(D)
%     Return a binary number corresponding to the non-negative integer D
%     (Behaves the same as dec2bin(D) )
%     
%         de2bs([123,321])  
%         ans = 001111011
%               101000001
%
% de2bs(D,BASE)
%     Return a string of symbols in base BASE corresponding 
%     to the non-negative integer D.
%     
%         de2bs(123,3)  
%         ans = 011120
%               102220
%  
%     If BASE is a string then the base is calculated as length(BASE),%     and characters of BASE are used as the symbols for the digits of D.  
%
%          de2bs (123,"aBc")
%          ans = aBBBca
%                Baccca
% 
% de2bs(D,ISOUTPUTNUMERICAL)  
%     By default,ISOUTPUTNUMERICAL is false   
%
%          de2bs([123,321],0) 
%          ans = 07B
%                141
%
%          de2bs([123,1) 
%          ans = 0    7   11
%                1    4    1
%
%
% de2bs(D,POS)
%     POS  - optional array of digits positions (like in bitget function)
%            By default pos = (ceil( log2(max(dec(:)))/log2(base)) ):-1:1 ) 
%
%          dde2bs([123,3,0)          
%          ans = 011120
%                102220
%           
%          de2bs([123,8:-2:2)
%          ans = 0012
%                0122
%
% See also: dec2base,base2dec,dec2bin,dec2hex.


% parsing input parameters ------------------------------------------
if nargin < 2  base = 2; end

symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

if (ischar(base))  symbols = base;  base = length(symbols); end
if  nargin < 3  isoutputnumerical = false; end

max_len = ceil( log2(max(dec(:)))/log2(base));

if  nargin < 4  pos = [max_len:-1:1]; end


% Conver decimals into base -----------------------------------------
pbs = [base.^(pos-1)];        % pbs - powers of base
dig = sum(rem(dec(:),base.*pbs) >= permute((1:base-1)'*pbs,1]),3);

if isoutputnumerical == false  dig = reshape(symbols(dig+1),size(dig)); end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-