Как определить количество байтов, необходимое для представления заданного целого числа? - PullRequest
0 голосов
/ 04 декабря 2011

Мне нужна функция в Java, чтобы дать мне количество байтов, необходимое для представления заданного целого числа. Когда я сдаю 2, он должен вернуть 1, 400 -> 2, 822222 -> 3 и т. Д.

@ Edit: сейчас я застрял с этим:

numOfBytes = Integer.highestOneBit(integer) / 8

Не знаю точно, что делает наивысшийOneBit (), но также пробовал это:

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

Который я нашел на каком-то сайте.

Ответы [ 8 ]

3 голосов
/ 11 декабря 2011

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 для правильного округления.

2 голосов
/ 04 декабря 2011

Ленивый / неэффективный способ сделать это с Integer#toBinaryString. Он удалит все начальные нули с положительных чисел для вас, все, что вам нужно сделать, это позвонить String#length и разделить на 8.

2 голосов
/ 04 декабря 2011
static int byteSize(long x) {
    if (x < 0) throw new IllegalArgumentException();
    int s = 1;
    while (s < 8 && x >= (1L << (s * 8))) s++;
    return s;
}
0 голосов
/ 19 октября 2017
int numOfBytes = (Integer.SIZE >> 3) - (Integer.numberOfLeadingZeros(n) >> 3);

Эта реализация достаточно компактна и в то же время удобна для исполнения, поскольку не включает в себя ни операции с плавающей запятой, ни цикла.

Она получена из формы:

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

Магическое число 3 в оптимизированной форме исходит из предположения: Byte.SIZE равно 8

0 голосов
/ 16 января 2016

Почему бы вам не сделать что-то простое, как это:

private static int byteSize(int val) {
    int size = 0;
    while (val > 0) {
        val = val >> 8;
        size++;
    }
    return size;
}
0 голосов
/ 28 апреля 2012

Для положительных значений: 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 является десятичным1, binary1 не может быть -1. Но что это будет? b11? Это 3.

0 голосов
/ 04 декабря 2011
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;
}
0 голосов
/ 04 декабря 2011

Подумайте, как решить ту же проблему, используя нормальные десятичные числа.Затем примените тот же принцип к двоичному / байтовому представлению, т.е. используйте 256, где вы бы использовали 10 для десятичных чисел.

...