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

众所周知,十进制转二进制的常用方法是除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中有类似函数()

对于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)。不过第二种方式在并行运算下理论上可以有更好的运行效率

没有现成的,自己实现就行

#include <bitset>

int main(void)
{
    short s = 11;
    std::bitset<16> s1;
    int i = 0;
    while (s) {
        s1[i++] = s & 0x01;
        s >>= 1;
    }
    return 0;
}

如有帮助,请采纳,谢谢