Java BigInteger дает неверный результат - PullRequest
1 голос
/ 04 июля 2019

Из этого поста Длина бита Я понял, что bitlength() даст вам

количество бит в представлении этого BigInteger

*, состоящем из двух минимальных комплементов.1008 *

Однако, когда я запустил следующий вывод программы: 0 Я ожидаю, что этот вывод будет 1 , так как число 0 представлено одним битом,Я запутался здесь, пожалуйста, помогите

public class Test {
    public static void main(String[] args) {
        int l = BigInteger.valueOf(0L).bitLength();
        System.out.println(l);
    }
}

1 Ответ

7 голосов
/ 04 июля 2019

Как указано в Javadoc :

Вычисления (ceil(log2(this < 0 ? -this : this+1))).

Поскольку this >= 0, он вычисляет ceil(log2(1)), log_anything(1) == 0 и ceil(0) == 0.


Вы спрашиваете в комментарии"как тогда представлен ноль :( Это должно потребовать чего-то глубоко в памяти".

A BigInteger, представляющий ноль, явно имеет некоторое представление в памяти. Но вы можете думать об этом как о массиве некоторого условного типа, bit, то есть bit[]. Ноль может быть представлен массивом нулевой длины new bit[]{} (но также может быть new bit[]{0}, new bit[]{0, 0} и т. Д.).

Для массива нормально иметь нулевую длину в Java (в спецификации он называется пустой массив ). Такой массив имеет нулевые элементы, но он имеет ненулевой размер в памяти, потому что ему нужно где-то хранить длину массива (и другие вещи для домашнего хозяйства).

bitLength() - это минимальная длина этого массива. Нулевая длина не означает, что массив не занимает места в памяти, просто его элементы не занимают дополнительного пространства.

...