Подсчитать, сколько битов в int без sizeof () - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь создать простую игру. Задача - создать программу, которая рассчитывает размер int в прикусах. Их код

#include <stdio.h>
int intSize(void)
{
    unsigned int x,
        i = 0;
        x = ?;
    while ((?) != 0)
        ?;
    return ?;
}
int main()
{
    printf("Size is %d bits\n",?);
    return 0;
}

? это место, куда я должен поместить свой код.

Это то, что одна из моих попыток

#include <stdio.h>
int intSize(void)
{
    unsigned int x,
        i = 0;
        x = 0;
    while ((x>>1) != 0)
        i++;
    return i;
}
int main()
{
    printf("Size ise %d bits\n", intSize());
    return 0;
}

Я знаю, что usigned int равен 4 байта, поэтому я использую побитовую операцию для перемещения битов, это должно быть 32 но я получаю 1. Я буду благодарен за любую помощь.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Я бы решил эту проблему, поставив 1 в младший бит целого числа и сдвинув влево до нуля, что означает, что бит синхронизирован полностью.

#include <stdio.h>
int intSize(void)
{
    unsigned int x,
        i = 0;
        x = 1;
    while ((x <<= 1) != 0)
        i++;
    return i+1;
}

int main()
{
    printf("Size is %d bits\n", /*?*/ intSize());
    return 0;
}

Насколько я могу судить, никаких опасений по поводу подписи / без знака.

РЕДАКТИРОВАТЬ , чтобы отразить? требования к заполнителю проекта.

1 голос
/ 29 апреля 2020

Имея

x = 0;
while ((x>>1) != 0)
  ...

, в то время как немедленно останавливается, поэтому i не изменяется и возвращаемое значение равно 0.

Правильный путь должен был инициализировать x с ~0u, чтобы все биты имели значение 1 (предположим, 2-дополнения)

Из-за этого тест не является правильным, и вы пропустили изменение значения x .

В

printf("Size ise %d bits\n", intSize);

вы пропустили () для вызова функции, в настоящее время вы пытаетесь напишите его адрес, я говорю, попробуйте, потому что адрес должен быть printf в формате %p.

Наконец:

#include <stdio.h>

int intSize(void)
{
  unsigned int x,
     i = 0;

  x = ~0u;
  while ((x & 1) != 0)
    (i+= 1, x /= 2); /* not x >= 1 in case it is a rotate rather than a shift */
  return (int) i;
}

int main()
{
    printf("Size is %d bits\n", intSize());
    return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -Wall s.c
pi@raspberrypi:/tmp $ ./a.out
Size is 32 bits
pi@raspberrypi:/tmp $ 

Итак, для того, чтобы '?' являются:

  • ~0u
  • x & 1
  • (i+= 1, x /= 2)
  • (int) i
...