而不是打印二进制数字如何将其存储为变量?

时间:2016-11-17 04:35:35

标签: c binary hex

我将十六进制数传入hex2bin并正确打印出二进制数,但我不想打印出我想要返回数字的数字,这样我就可以用它来查找数字的基数数。如何存储数字而不是打印出来?

createAuthentication

4 个答案:

答案 0 :(得分:1)

也许是这样的?

int result = 0;
int i, k...
...
result = result | (((k == 0) ? 0 : 1) << i;
...
return result;

当然,您也可以简单地使用变量数组而不是巧妙地使用int。

答案 1 :(得分:1)

将数字存储在一个字符串中,该字符串的空间由复合文字提供(自C99起可用)。

它与OP的流程类似:循环到sizeof(int) * 8次,找到1位的值并打印/保存它。

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

// Maximum buffer size needed
#define UTOA_BASE_2 (sizeof(unsigned)*CHAR_BIT + 1)

char *utoa_base2(char *s, unsigned x) {
  s += UTOA_BASE_2 - 1;
  *s = '\0';
  do {
    *(--s) = "01"[x % 2];
    x /= 2;
  } while (x);
  return s;
}

#define TO_BASE2(x) utoa_base2((char [UTOA_BASE_2]){0} , (x))

void test(unsigned x) {
  printf("base10:%10u base2:%5s ", x, TO_BASE2(x));
  char *s = TO_BASE2(x);
  // do stuff with `s`, it is valid for until the end of this block
  printf("%s\n", s);
}

int main(void) {
  test(0);
  test(25);
  test(UINT_MAX);
}

示例输出

base10:         0 base2:    0 0
base10:        25 base2:11001 11001
base10:4294967295 base2:11111111111111111111111111111111 11111111111111111111111111111111

这是此base-n answer的变体。

答案 2 :(得分:0)

您可以使用strcat功能来执行此操作。

请注意,此答案中的新hex2bin函数假定参数char *buf已经分配,​​并且可以保存至少1+sizeof(int)*8个字节,包括空终止符:

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

// assume: buf is at least length 33
int hex2bin (int n, char *buf)
{
    int i,k,mask;
    for(i = sizeof(int) * 8 - 1; i >= 0; i--){
         mask = 1 << i;
         k = n & mask;
         k == 0 ? strcat(buf, "0") : strcat(buf, "1");
    }
    return 0;
}

int main()
{
    int n = 66555;
    char buffer[1+sizeof(int)*8] = { 0 } ;
    hex2bin(n, buffer);
    printf("%s\n", buffer);
    return 0;
}

答案 3 :(得分:0)

我希望你会发现这很有用:)

bool convertDecimalBNR(INT32 nDecimalValue, UINT32 * punFieldValue, INT32 nBitCount, DecimalBNRType * pDecimalSpecification)
{
  bool   bBNRConverted = false;
  INT32  nBitIndex = nBitCount - 1;
  INT32  nBitValue = anTwoExponents[nBitIndex];

  *punFieldValue = 0;

  if ((nDecimalValue >= pDecimalSpecification->nMinValue) && (nDecimalValue <= pDecimalSpecification->nMaxValue))
  {
        // if the value is negative, then add (-1 * (2 ^ (nBitCount - 1))) on itself and go on just like a positive value calculation.
    if (nDecimalValue < 0)
    {
      nDecimalValue += nBitValue;
      nBitIndex--;
      nBitValue /= 2;
      *punFieldValue |= BIT_0_ONLY_ONE;
    }

    while (nBitIndex >= 0)
    {
      *punFieldValue = (*punFieldValue << 1);

      if (nDecimalValue >= nBitValue)
      {
        nDecimalValue -= nBitValue;
        *punFieldValue |= BIT_0_ONLY_ONE;
      }

      nBitIndex--;
      nBitValue /= 2;
    }

    if (nDecimalValue <= nBitValue)
    {
      bBNRConverted = true;
    }
  }

  return (bBNRConverted);
}