алгоритм, чтобы выяснить, сколько байтов требуется для хранения целого - PullRequest
4 голосов
/ 17 марта 2011

извините за глупый вопрос, но как мне понять, математически или с помощью c ++, сколько байт потребуется для хранения целого числа.

Ответы [ 10 ]

9 голосов
/ 17 марта 2011

Вы можете найти первую степень 2, которая больше вашего числа, и разделить эту степень на 8, а затем округлить число до ближайшего целого числа.Таким образом, для 1000 степень 2 равна 1024 или 2 ^ 10;разделите 10 на 8, чтобы получить 1,25, и округлите до 2. Вам нужно два байта для хранения 1000!

6 голосов
/ 17 марта 2011

Если вы имеете в виду с точки зрения теории информации , то простой ответ:

log(number) / log(2)

(не имеет значения, являются ли они естественными, двоичными или общими логарифмы , из-за деления на log(2), которое вычисляет логарифм с основанием 2.)

Здесь указывается количество бит, необходимое для хранения вашего числа.

Если вас интересует, сколько памяти требуется для эффективного или обычного кодирования вашего номера на определенном языке или в определенной среде, вам необходимо провести некоторое исследование.:)

Типичные диапазоны C и C ++ для целых чисел:

 char    1 byte
 short   2 bytes
 int     4 bytes
 long    8 bytes

Если вас интересуют целые числа произвольного размера, доступны специальные библиотеки икаждая библиотека будет иметь свой собственный механизм внутреннего хранения, но обычно она будет хранить числа с помощью 4- или 8-байтовых блоков до размера номера.

3 голосов
/ 17 марта 2011

Если вы имеете в виду «насколько велико целое число», тогда ответом будет sizeof(int).

Если вы имеете в виду «как маленький тип я могу использовать для хранения значений этой величины», то это немного большесложный.Если у вас уже есть значение в виде целого числа, то, вероятно, оно умещается в 4, 3, 2 или 1 байт.Для значений без знака, если это 16777216 или более, вам нужно 4 байта, 65536-16777216 требуется 3 байта, 256-65535 нужно 2, а 0-255 помещается в 1 байт.Формула для этого исходит из того факта, что каждый байт может содержать 8 битов, а каждый бит содержит 2 цифры, поэтому 1 байт содержит 2 ^ 8 значений, т.е.256 (но начиная с 0, поэтому 0-255).Таким образом, 2 байта содержат 2 ^ 16 значений, т.е.65536 и т. Д.

Вы можете обобщить это за пределы обычных 4 байтов, используемых для типичного типа int, если хотите.Если вам нужно разместить целые числа со знаком, а также без знака, имейте в виду, что 1 бит эффективно используется для хранения положительных или отрицательных значений, поэтому величина равна 1 степени на 2 меньше.

Вы можете вычислитьколичество бит, которое вам нужно итеративно из целого числа, разделив его на два и отбросив остаток.Каждое деление, которое вы можете сделать и у которого все еще есть ненулевое значение, означает, что вы используете еще один бит данных - и каждые 8 ​​бит, которые вы используете, означают 1 байт.

Быстрый способ вычисления этого состоит в том, чтобыиспользуйте функцию сдвига вправо и сравните результат с нулем.

int value = 23534; // or whatever
int bits = 0;

while (value)
{
    value >> 1;
    ++bits;
}
std::cout << "Bits used = " << bits << std::endl;
std::cout << "Bytes used = " << (bits / 8) + 1 << std::endl;
2 голосов
/ 17 марта 2011

Это в основном тот же вопрос, что и "сколько двоичных цифр потребуется для хранения числа x ?" Все, что вам нужно, это логарифм.

A n -битное целое число может хранить числа до 2 n -1. Таким образом, учитывая число x , ceil (log 2 x ) получает необходимое вам количество цифр.

Это то же самое, что вычислить, сколько десятичных цифр вам нужно написать число от руки. Например, log 10 123456 = 5.09151220 ..., поэтому ceil (log 10 (123456)) = 6, шесть цифр.

1 голос
/ 07 сентября 2013

Кратчайший код способ сделать это следующим образом:

int bytes = (int)Math.Log(num, 256) + 1;

Код достаточно мал, чтобы быть встроенным, что помогает компенсировать «медленный» код FP. Также нет филиалов, которые могут быть дорогими.

1 голос
/ 17 марта 2011

Поскольку никто не выполнил простейший код, который работает, я тоже не против:

unsigned int get_number_of_bytes_needed(unsigned int N) {
  unsigned int bytes = 0;
  while(N) { 
    N >>= 8;
    ++bytes;
  };
  return bytes;
};
1 голос
/ 17 марта 2011

при условии sizeof(long int) = 4.

int nbytes( long int x )
{
  unsigned long int n = (unsigned long int) x;

  if (n <= 0xFFFF)
  {
    if (n <= 0xFF) return 1;
    else return 2;
  }
  else
  {
    if (n <= 0xFFFFFF) return 3;
    else return 4;
  }
}
0 голосов
/ 26 июня 2014

Этот код работает на моем ноутбуке со скоростью 447 миллионов тестов в секунду, где i = от 1 до 1E9.i является подписанным int:

n = (i > 0xffffff || i < 0) ? 4 : (i < 0xffff) ? (i < 0xff) ? 1 : 2 : 3;
0 голосов
/ 17 марта 2011

Попробуйте этот код:

// works for num >= 0
int numberOfBytesForNumber(int num) {
   if (num < 0)
      return 0;
   else if (num == 0)
      return 1;
   else if (num > 0) {
      int n = 0;
      while (num != 0) {
        num >>= 8;
        n++;
      }
      return n;
   }
}
0 голосов
/ 17 марта 2011
/**
 * assumes i is non-negative.
 * note that this returns 0 for 0, when perhaps it should be special cased?
 */
int numberOfBytesForNumber(int i) {
    int bytes = 0;
    int div = 1;
    while(i / div) {
        bytes++;
        div *= 256;
    }
    if(i % 8 == 0) return bytes;
    return bytes + 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...