【问题标题】:Decimal To Binary in C Char ArrayC字符数组中的十进制到二进制
【发布时间】:2018-06-27 12:22:46
【问题描述】:

我想从一个十进制数返回一个 16BIT 二进制。我有 2 个代码。
在第一个中,我尝试返回一个 char 数组。
在第二个中,a 有一个输出,但它的顺序相反。
也许有人看一下代码。 谢谢

输出第一个函数:Þ0000000000010000es (x862uÿ¼×

#include <stdio.h>
#include <stdlib.h>

const int BIT = 16;

void binary(int);
char *bin(int);


int main() {

    binary(16);
    printf("\n");
    printf("%s\n", bin(16));

    return 0;
}


char *bin(int x) {

    char * new = (char*)malloc(sizeof(char) * BIT + 1);
    new[BIT] = '\0';

    if (x >= 0 && x <= 65535) {
        for (int i = 0; i < BIT; i++) {
            if (x % 2 == 0) {
                new[BIT - i] = '0';
            } else {
                new[BIT - i] = '1';
            }
            x = x / 2;
        }
    }

    return new;
}


void binary(int x) {

    if (x >= 0 && x <= 65535) {
        for (int i = 0; i < BIT; i++) {
            if (x % 2 == 0) {
                printf("0");
            } else {
                printf("1");
            }
            x = x / 2;
        }
    }
}

【问题讨论】:

  • 您不能返回指向自动数组的指针,因为返回时不再分配存储空间。要么从调用者传入数组,要么使用malloc 分配它。
  • 在你的第二个函数中,首先找到最高的非零位作为你的起点,然后从左到右输出数字。
  • 最高非零位是什么意思?
  • 您的二进制数可能被视为 0 位和 1 位的序列。最高的非零位就是最左边的非零位。从最左边的非零位开始,然后依次输出其右边的位。如果你的号码是 11010,从最左边的 1 开始,然后从左到右依次输出位:1,然后 1,然后 0,然后 1,然后 0。
  • @PaulNie 也许你需要问一个具体的问题。您现在的问题是“也许有人看一下代码” - 这并不具体。试着在你的问题中表达你想要完成什么,以及你设法做到了什么。然后人们可以填写其余部分。此外,您编写了两段代码来完成相同的任务 - 为什么?您尝试通过重写来修复的第一段代码是否有任何问题?如果是,问题是什么?你可以edit你的问题来指定这些细节。

标签: c arrays binary decimal


【解决方案1】:

我试着回答你的问题。我对任何人对我的投票不感兴趣......所以我尽我所能!

  1. 如果您想要一个十进制值的二进制表示,最简单的方法是检查位 0,然后只要它不为零,就移位该数字。右移一位相当于除以 2。
  2. 不要检查数字是否在 0 和 65535 之间,如果要中止,只需查看它是否为零即可。如果您想要固定数量的班次,也可以从 1 数到 16。

所以我会建议这样的事情:

do {
   if (number & 1) {
       printf("1");
   } else {
       printf("0");
   }
   number >>= 1;
} while(number);

这会以相反的方向输出零和一,直到不再有零。

如果你想要一个固定宽度的表示:

#define BITS 16

for (int bits = 0; bits < BITS; bits++) {
  if (number & 1) {
       printf("1");
   } else {
       printf("0");
   }
   number >>= 1;
}

如果要将其存储到数组中,请将 printf 替换为

char *bitmap = (char*)malloc(BITS+1);
bitmap[BITS] = '\0';  // NULL termination

bitmap[BITS-1-bits] = '1';

bitmap[BITS-1-bits] = '0';

分别 并且有

printf("%s\n", bitmap);

别忘了free(bitmap).

始终考虑,数组是从零开始索引的。所以最好是 在 16 位的情况下,位编号从 0 到 15。 我没有测试过这段代码,但它是这样工作的。 :)

【讨论】:

  • 第一个函数看起来不错。我已经更改了代码,但输出中有问题。
  • 有什么问题?
  • 我更改了上面的代码。输出为:Þ0000000000010000PROCESSORS=8
  • 我在上面测试了你的代码,它工作正常。 ~~out 6 00000000001000000000101010001000101010001010100000100010100000001000000000100000000000100010000000001000100> / a.out 66 00000000001/0101000000000001010100000000010000010000000100000100> / a.out 66 0000000000_00000000010100101010000000 /跨度>
【解决方案2】:

这行得通,函数bin() 覆盖main()How do I return a char array from a function?)中的数组arr

#include <stdio.h>
#include <stdlib.h>

const int BIT = 16;

void binary(int);
void bin(char*, int);


int main(int argc, char* argv[]) {

    int x ;

    x = atoi(argv[1]);

    char arr[BIT+1];

    //binary(16);

    bin(arr, x);   // functions overwrites array arr

    arr[BIT] = '\0';   // strings have to be null-terminated in C

    printf("%s \n", arr);

    return 0;
}

void bin(char *arr1,int x) {


    if (x >= 0 && x <= 65535)
      {
        for (int i = BIT-1; i >= 0; i--) 
              {
            if (x % 2 == 0) 
                  {
                    arr1[i] = '0';
                  } else 
                  {
                    arr1[i] = '1';
                  }
            x = x / 2;
               }

      }

}

【讨论】:

    猜你喜欢
    • 2015-05-26
    • 2013-05-13
    • 2018-05-17
    • 2013-08-13
    • 2021-05-18
    • 1970-01-01
    • 2012-12-12
    • 2015-09-22
    相关资源
    最近更新 更多