算法,以确定持有int需要多少字节

时间:2011-03-17 02:37:43

标签: c++ algorithm math

对不起这个愚蠢的问题,但我怎样才能用数学方法或使用c ++来计算存储整数所需的字节数。

11 个答案:

答案 0 :(得分:9)

您可以找到2的第一个幂大于您的数字,并将该幂除以8,然后将该数字四舍五入到最接近的整数。所以对于1000,2的幂是1024或2 ^ 10;将10除以8得到1.25,向上舍入为2.你需要两个字节才能容纳1000!

答案 1 :(得分:6)

如果您从information theory的角度来看,那么简单的答案就是:

log(number) / log(2)

(如果它们是自然的,二元的或共同的logarithms并不重要,因为log(2)除以2来计算对数 char 1 byte short 2 bytes int 4 bytes long 8 bytes 。)

报告存储号码所需的位数。

如果您对特定语言或环境中您的号码的高效常规编码需要多少内存感兴趣,则需要执行此操作有些研究。 :)

整数的典型C和C ++范围是:

{{1}}

如果您对任意大小的整数感兴趣,special libraries可用,并且每个库都有自己的内部存储机制,但它们通常通过4或8字节块存储数字,直到数字的大小。

答案 2 :(得分:3)

如果你的意思是“int有多大”,那么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,等等。

如果您愿意,可以将其概括为超出用于典型int的正常4个字节。如果你需要适应有符号整数和无符号整数,请记住1位有效地用于存储它是正还是负,所以幅度是2次幂的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;

答案 3 :(得分:2)

这与“存储数字 x 需要多少二进制数字基本相同?”你所需要的只是对数。

n 位整数可以存储最多2 n -1的数字。因此,给定一个数字 x ,ceil(log 2 x )可以获得所需的位数。

与确定手动编写数字需要多少个十进制数字完全相同。例如,log 10 123456 = 5.09151220 ...,所以ceil(log 10 (123456))= 6,6位数。

答案 4 :(得分:1)

假设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;
  }
}

答案 5 :(得分:1)

由于没有人提出最简单的代码,我也会这样做:

unsigned int get_number_of_bytes_needed(unsigned int N) {
  unsigned int bytes = 0;
  while(N) { 
    N >>= 8;
    ++bytes;
  };
  return bytes;
};

答案 6 :(得分:1)

最短代码的方法如下:

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

代码足够小,可以内联,这有助于抵消&#34;慢&#34; FP代码。此外,没有分支,这可能是昂贵的。

答案 7 :(得分:0)

/**
 * 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;
}

答案 8 :(得分:0)

试试这段代码:

// 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;
   }
}

答案 9 :(得分:0)

此代码在我的笔记本电脑上以4.47亿次测试/秒运行,其中i = 1到1E9。 i是签名的int:

n = (i > 0xffffff || i < 0) ? 4 : (i < 0xffff) ? (i < 0xff) ? 1 : 2 : 3;

答案 10 :(得分:0)

Python示例:没有日志或指数,只是移位。

注意:0计为0位,仅正int有效。

def bits(num):
    """Return the number of bits required to hold a int value."""
    if not isinstance(num, int):
        raise TypeError("Argument must be of type int.")
    if num < 0:
        raise ValueError("Argument cannot be less than 0.")

    for i in count(start=0):
        if num == 0:
            return i
        num = num >> 1