不悔Drew 2022-07-14 23:27 采纳率: 100%
浏览 31
已结题

关于十进制转二进制的方法问题

众所周知,十进制转二进制的常用方法是除2取余法。这种方法刚开始学的时候感觉很巧妙,可是我后面越想越不对劲,这不是多此亿举吗?

举个例子,假设有一个short类型数据为11,并且我的系统中short长度为16bit,那么它在内存中的表示应为000000000001011,那么很明显,我们能直接取1011(先不考虑负数)。而如果用除二取余的话,就算使用位运算符,效率也明显比前一种方法慢了至少10倍。

这是网上的十进制转二进制方法


int main(){
    cin>>n;
    while(n!=0){
        ans[len] = n % 2;
        len++;
        n = n / 2;
    }
    for(int i=len-1;i>=0;i--){
        printf("%d",ans[i]);
    }
    return 0;
} 

那么有没有一种数据结构或函数(C++),它可以直接获取内存中的二进制数据,并把每个值插入到一个每个数据只有一位的整型数组呢?(假设这种整型叫bit,函数叫bin(),那么对于一个short数据18,则可以输入以下代码)

int main(){

    bit n[16];
    bin(n);
    return 0;
}

我在网上查了很久,始终没有任何人说过关于这方面的内容,但是我查到了Python中有类似函数()
  • 写回答

2条回答 默认 最新

  • 不吐泡泡的咸鱼 2022-07-14 23:55
    关注

    对于10进制转2进制表示,你所疑惑的问题本质其实是二进制的位表示和二进制的字符表示之间的转换,他们是两种内存表示,每以为的单元,以及长度都不相同,不能像int转float一样直接重新解释内存就可以得到,所以转换是必须的。即使使用bin函数,也是在该函数内做的转换。

    // 2进制位表示
    |---------------|
    |0|0|1|0|1|1|0|1|
    |---------------|
    
    // 2进制字符表示
    |---------------|---------------|---------------|---------------|---------------|---------------|
    |----..HL3------|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|
    |---------------|---------------|---------------|---------------|---------------|---------------|
    
    // short内存表示
    |---------------|---------------|
    |0|0|0|0|0|0|0|0|0|0|1|0|1|1|0|1|
    |---------------|---------------|
    
    // int 内存表示
    |---------------|---------------|---------------|---------------|
    |0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|1|0|1|
    |---------------|---------------|---------------|---------------|
    
    拿着地位地址重新解释即可完成short和int的转换,但是整型转char[]是两种不同的内存表示,无法通过重新解释来完成。必须使用程序方式加以转换
    

    至于转换的方式,求余是一种方式,当然你也可以使用000...1...0掩码来与原数字相与来完成这种转换,不论那种方式,对于int n,其时间复杂度至少在O(log2)。不过第二种方式在并行运算下理论上可以有更好的运行效率

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月4日
  • 已采纳回答 7月27日
  • 创建了问题 7月14日

悬赏问题

  • ¥15 对于知识的学以致用的解释
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败