как я могу побитно получить произвольное десятичное число - PullRequest
0 голосов
/ 28 мая 2020

Я хочу побитно прочитать число int из списка, например: десятичный список: [28,171,3,324,66]

первый: 28 двоичный: 100111 второй: 171 двоичный: 10101011 .. .

Я пытался выполнить побитовую операцию, но я не знаю длины двоичного файла (например, длина 100111 = 6). Поэтому я не могу выполнить побитовую операцию. Есть ли способ прочитать произвольное число?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Если вы пытаетесь получить битовое представление из целочисленного значения, вот пример того, как это сделать. Каждый бит приходится проверять вручную, встроенной утилиты для перебора «битов» нет.

#include <stdio.h>

int main(int argc, char const *argv[])
{
  int numbers[] = { 28, 171, 3, 324, 66 };
  int numberslength = (int) (sizeof(numbers) / sizeof(int));

  // each number
  for (int i = 0; i < numberslength; ++i)
  {
    int number = numbers[i];  // get the number
    int mask = 1;             // start at the beginning
    for (int j = 0; j < sizeof(int) * 8; ++j)
    {
      // if the number has a bitwise and in that bit, 1
      printf("%c", number & mask ? '1': '0');

      // move the mask over to the next bit
      mask <<= 1;
    }

    // separate outputs by newline
    printf("\n");
  }

  return 0;
}
0 голосов
/ 28 мая 2020

Вот версия, в которой число сдвигается вправо до нуля и строится буфер справа налево:

#include <stdio.h>

const char *
bitprt(unsigned int val)
{
    char *bp;
    char *rtn;
    static char buf[128 + 1];

    bp = &buf[sizeof(buf) - 1];
    *bp-- = 0;

    *bp = '0';
    rtn = bp;

    for (;  val != 0;  val >>= 1, --bp) {
        if (val & 1)
            *bp = '1';
        else
            *bp = '0';
        rtn = bp;
    }

    return rtn;
}

void
dotest(unsigned int val)
{
    const char *buf;

    buf = bitprt(val);
    printf("%20u: '%s'\n",val,buf);
}

int
main(void)
{

    dotest(28);
    dotest(171);
    dotest(3);
    dotest(324);
    dotest(66);

    return 0;
}

Вот результат программы:

                  28: '11100'
                 171: '10101011'
                   3: '11'
                 324: '101000100'
                  66: '1000010'
...