如何确定表示给定整数所需的字节数?

时间:2011-12-04 17:14:15

标签: java byte

我需要一个Java函数来给出表示给定整数所需的字节数。当我通过2时它应该返回1,400 - > 2,822222 - > 3,等等。

@Edit:现在我坚持这个:

numOfBytes = Integer.highestOneBit(integer) / 8

不确切知道highOneBit()的作用,但也试过了:

numOfBytes = (int) (Math.floor(Math.log(integer)) + 1);

我在某个网站上找到了。

8 个答案:

答案 0 :(得分:3)

Integer.highestOneBit(arg)仅返回原始位置中的最高设置位。例如,Integer.highestOneBit(12)是8,而不是3.所以你可能想要使用Integer.numberOfTrailingZeros(Integer.highestOneBit(12)),它确实返回3.这是Integer API

一些示例代码:

numOfBytes = (Integer.numberOfTrailingZeroes(Integer.highestOneBit(integer)) + 8) / 8;

+ 8用于正确舍入。

答案 1 :(得分:2)

static int byteSize(long x) {
    if (x < 0) throw new IllegalArgumentException();
    int s = 1;
    while (s < 8 && x >= (1L << (s * 8))) s++;
    return s;
}

答案 2 :(得分:2)

执行此操作的惰性/低效方法是使用Integer#toBinaryString。它将为您删除正数中的所有前导零,您只需拨打String#length并除以8

答案 3 :(得分:0)

考虑如何使用普通的十进制数来解决同样的问题。然后将相同的原理应用于二进制/字节表示,即使用256,其中您将使用10作为十进制数。

答案 4 :(得分:0)

static int byteSize(long number, int bitsPerByte) {
    int maxNumberSaveByBitsPerByte = // get max number can be saved by bits in value bitsPerByte
    int returnValue = getFloor(number/maxNumberSaveByBitsPerByte); // use Math lib
    if(number % maxNumberSaveByBitsPerByte != 0)
            returnValue++;
    return returnValue;
}

答案 5 :(得分:0)

对于正值:0和1需要1位数,2位数字可以得到加倍的最大值,对于每个数字,它是该值的2倍。因此,递归解决方案是划分:

public static int binaryLength (long l) {
    if (l < 2) return 1; 
    else 1 + binaryLength (l /2L);
}

但转变也有效:

public static int binaryLength (long l) {
    if (l < 2) return 1; 
    else 1 + binaryLength (l >> 1);
}

负值具有前导1,因此对于该问题没有多大意义。如果我们假设binary1是decimal1,则binary1不能为-1。但它会是什么? B11?那就是3.

答案 6 :(得分:0)

为什么你不会做这样简单的事情:

private static int byteSize(int val) {
    int size = 0;
    while (val > 0) {
        val = val >> 8;
        size++;
    }
    return size;
}

答案 7 :(得分:0)

int numOfBytes = (Integer.SIZE >> 3) - (Integer.numberOfLeadingZeros(n) >> 3);

这种实现非常紧凑,性能友好,因为它不涉及任何浮点运算,也不涉及任何循环。

它来自以下形式:

int numOfBytes = Math.ceil((Integer.SIZE - Integer.numberOfLeadingZeros(n)) / Byte.SIZE);

优化形式中的幻数3来自以下假设:Byte.SIZE等于8