查找特定整数的最大位数

时间:2017-10-11 03:43:56

标签: java binary logarithm

好吧,伙计们,我完全陷入了这个小问题,我花了几个小时试图研究并找出答案。基本上我所要做的就是找到一个整数的最大位数(使用一个字节作为限制)。我想要做的一个例子是:int 5将显示为8,因为在一个字节中它存储为0000 0101.所有包括255的内容应该输出8.一旦你达到256,它应该输出因为它将被存储为0001 0000 0000。我可以使用if语句但是使用日志有更简单的方法吗?

到目前为止,我所拥有的只是:

    int x = 5;
    int len = (Integer.toString(x)).length();
    double bits = Math.ceil(len*(Math.log(10)/Math.log(2)));
    System.out.println(bits);

3 个答案:

答案 0 :(得分:1)

一种非常简单的方法:

final double DIVISOR = Math.log(256);

int x = 5;
double bytes = Math.log(x) / DIVISOR;
int bits = (int) Math.ceil(bytes) * 8;

这通过计算基数256中的位数来计算数字的字节数(包括部分字节数)。这使用了两个技巧:

  • 基数 n 中的数字 x 的位数由log n (x)给出。
  • log n (x)相当于log m (x)/ log m (n)对于任何 m < / em>的

然后将结果向上舍入(处理任何部分字节),并乘以8得到位数。

但请注意,这不一定是一种非常有效的方法。有更多有效的方法可以使用位操作,但可能有点难以理解。至少,这种方法看起来与你已经尝试过的方法类似。

答案 1 :(得分:0)

试试这个:

int bytesNeeded(int x) {
    int bytes = 0;
    for (; x != 0; bytes++) {
        x >>>= 8; // Shift 8 bits (1 byte) right
        bytes++; // Count 1 more byte
    }
    return bytes;
}

x >>> y,将x向右移y个字节,并在左侧插入0。例如,0b00000001 >>> 1 => 0b000000000b11110000 >>> 2 => 0b00111100。此函数一次向下移动x个字节,直到没有1为止。它必须移动的次数是表示它需要多少字节。

编辑:切换到>>>运算符以处理负数。

答案 2 :(得分:0)

也可以使用递归:

int getNumberOfBytes(int number) {
    if((int)(number / 256) == 0) {
        return 1;
    }

    return getNumberOfBytes(number / 256) + 1;
}