为了账号安全,请及时绑定邮箱和手机立即绑定

使用C以二进制表示形式打印int

/ 猿问

使用C以二进制表示形式打印int

C
撒科打诨 2019-11-15 12:52:42

我在寻找一个允许我打印int二进制表示形式的函数。到目前为止,我所拥有的是:


char *int2bin(int a)

{

 char *str,*tmp;

 int cnt = 31;

 str = (char *) malloc(33); /*32 + 1 , because its a 32 bit bin number*/

 tmp = str;

 while ( cnt > -1 ){

      str[cnt]= '0';

      cnt --;

 }

 cnt = 31;

 while (a > 0){

       if (a%2==1){

           str[cnt] = '1';

        }

      cnt--;

        a = a/2 ;

 }

 return tmp;


}

但是当我打电话


printf("a %s",int2bin(aMask)) // aMask = 0xFF000000

我得到类似的输出;


0000000000000000000000000000000000000000xtpYy(还有一堆未知字符。


这是功能上的缺陷还是我在打印字符数组的地址或其他内容?抱歉,我看不到哪里出了问题。


注意:代码从这里


编辑:这不是家庭作业,仅供参考,我正在尝试用一种不熟悉的语言调试其他人的图像处理例程。但是,如果因为它是一个基本概念而被标记为家庭作业,那么公平竞争就可以了。


查看完整描述

3 回答

?
皈依舞

这是另一个优化的选项,用于传递分配的缓冲区。确保尺寸正确。


// buffer must have length >= sizeof(int) + 1

// Write to the buffer backwards so that the binary representation

// is in the correct order i.e.  the LSB is on the far right

// instead of the far left of the printed string

char *int2bin(int a, char *buffer, int buf_size) {

    buffer += (buf_size - 1);


    for (int i = 31; i >= 0; i--) {

        *buffer-- = (a & 1) + '0';


        a >>= 1;

    }


    return buffer;

}


#define BUF_SIZE 33


int main() {

    char buffer[BUF_SIZE];

    buffer[BUF_SIZE - 1] = '\0';


    int2bin(0xFF000000, buffer, BUF_SIZE - 1);


    printf("a = %s", buffer);

}


查看完整回答
反对 回复 2019-11-15
?
慕码人2483693

一些建议:


空终止您的字符串

不要使用幻数

检查的返回值 malloc()

不要转换的返回值 malloc()

对二进制表示法感兴趣的话,请使用二进制运算而不是算术运算

不需要循环两次

这是代码:


#include <stdlib.h>

#include <limits.h>


char * int2bin(int i)

{

    size_t bits = sizeof(int) * CHAR_BIT;


    char * str = malloc(bits + 1);

    if(!str) return NULL;

    str[bits] = 0;


    // type punning because signed shift is implementation-defined

    unsigned u = *(unsigned *)&i;

    for(; bits--; u >>= 1)

        str[bits] = u & 1 ? '1' : '0';


    return str;

}


查看完整回答
反对 回复 2019-11-15
?
明月笑刀无情

您的字符串不是以null终止的。确保'\0'在字符串末尾添加一个字符;或者,您可以用calloc代替分配它malloc,这将使返回给您的内存归零。


顺便说一句,此代码还有其他问题:


使用时,它在您调用内存时分配内存,而调用方则负责free()分配已分配的字符串。如果只是在printf通话中调用它,则会泄漏内存。

它使号码两次通过,这是不必要的。您可以一次完成所有操作。

这是您可以使用的替代实现。


#include <stdlib.h>

#include <limits.h>


char *int2bin(unsigned n, char *buf)

{

    #define BITS (sizeof(n) * CHAR_BIT)


    static char static_buf[BITS + 1];

    int i;


    if (buf == NULL)

        buf = static_buf;


    for (i = BITS - 1; i >= 0; --i) {

        buf[i] = (n & 1) ? '1' : '0';

        n >>= 1;

    }


    buf[BITS] = '\0';

    return buf;


    #undef BITS

}

用法:


printf("%s\n", int2bin(0xFF00000000, NULL));

第二个参数是指向缓冲区要存储在结果字符串。如果没有缓冲,你可以通过NULL和int2bin将写入static缓冲区,回报给你。与原始实现相比,此方法的优势在于,调用者不必担心free()会获取返回的字符串。


缺点是只有一个静态缓冲区,因此后续调用将覆盖先前调用的结果。您无法保存多个调用的结果供以后使用。同样,它也不是线程安全的,这意味着如果您从不同的线程中以这种方式调用该函数,它们可能会破坏彼此的字符串。如果有可能,您需要传递自己的缓冲区而不是传递NULL,如下所示:


char str[33];

int2bin(0xDEADBEEF, str);

puts(str);


查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信