首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二进制转换函数

二进制转换函数
EN

Stack Overflow用户
提问于 2019-03-05 00:50:14
回答 3查看 94关注 0票数 2

我试图使用下面用C编写的函数将十进制值转换为二进制值。我不知道为什么它要打印32个零,而不是二进制值2。

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>

int binaryConversion(int num){
    int bin_buffer[32];
    int mask = INT_MIN;
    for(int i = 0; i < 32; i++){
        if(num & mask){
            bin_buffer[i] = 1;
            mask >> 1;
        }
        else{
            bin_buffer[i] = 0;
            mask >> 1;
        }
    }
    for(int j = 0; j < 32; j++){
        printf("%d", bin_buffer[j]);
    }
}


int main(){
    binaryConversion(2);
}

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-05 00:54:22

两个错误:

  1. 您使用的是>>而不是>>=,因此您实际上不会更改mask
  2. 您没有声明maskunsigned,所以当您移动时,它会得到符号扩展,这是您不想要的。
票数 3
EN

Stack Overflow用户

发布于 2019-03-05 01:12:11

您已经回答了关于使用>>而不是=>>的主要问题。但是,从基本的角度来看,不需要将10缓冲在int数组中(例如,int bin_buffer[32];),如果只输出数字的二进制表示,则无需使用variadic printf函数来显示int值。

相反,您所需要的只是putchar()输出'1''0',这取决于是否设置了任何位。还可以通过提供所需表示的大小,例如byte (8位)、word (16位)等等,使输出函数更加有用。

例如,您可以:

代码语言:javascript
复制
#include <stdio.h>
#include <limits.h>

/** binary representation of 'v' padded to 'sz' bits.
 *  the padding amount is limited to the number of
 *  bits in 'v'. valid range: 0 - sizeof v * CHAR_BIT.
 */
void binaryConversion (const unsigned long v, size_t sz)
{
    if (!sz) { fprintf (stderr, "error: invalid sz.\n"); return; }
    if (!v)  { while (sz--) putchar ('0'); return; }

    if (sz > sizeof v * CHAR_BIT)
        sz = sizeof v * CHAR_BIT;

    while (sz--)
        putchar ((v >> sz & 1) ? '1' : '0');
}

int main(){
    fputs ("byte : ", stdout);
    binaryConversion (2, 8);
    fputs ("\nword : ", stdout);
    binaryConversion (2, 16);
    putchar ('\n');
}

它允许您设置想要显示的位数。

示例使用/输出

代码语言:javascript
复制
$ ./bin/binaryconversion
byte : 00000010
word : 0000000000000010

您的方法没有什么问题,但是可能有一种更简单的方法来获得相同的输出。

如果你还有其他问题,请告诉我。

票数 0
EN

Stack Overflow用户

发布于 2019-03-05 02:06:40

INT_MIN是一个负数,所以当您使用>>转到右边时,最重要的位仍然是1而不是零,您将在mask=11111...111中结束所有位都有1的值。而且,mask值没有变化。最好用>>=代替。您可以尝试在0x1上隐藏,并改变num的实际值,而不是这样的mask

代码语言:javascript
复制
int binaryConversion(int num) {
    char bin_buffer[32 + 1];  //+1 for string terminator.
    int shifted = num;
    for (int i = 31; i >= 0; --i, shifted >>= 1) {  //loop 32x
        bin_buffer[i] = '0' + (shifted & 0x1);
    }
    bin_buffer[32] = 0;  //terminate the string.

    printf("%s", bin_buffer);

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54993842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档