Như được hiển thị bởi các câu trả lời khác, việc sử dụng
assert 4 == [0b1111].bit_length[]
assert 8 == [0b1011_1000].bit_length[]
assert 9 == [0b1_1011_1000].bit_length[]
1 dẫn đến kết quả không chính xác cho assert 4 == [0b1111].bit_length[]
assert 8 == [0b1011_1000].bit_length[]
assert 9 == [0b1_1011_1000].bit_length[]
2 lớn trong khi sử dụng assert 4 == [0b1111].bit_length[]
assert 8 == [0b1011_1000].bit_length[]
assert 9 == [0b1_1011_1000].bit_length[]
3 hoặc vòng lặp thủ công dẫn đến hiệu suất chậm cho assert 4 == [0b1111].bit_length[]
assert 8 == [0b1011_1000].bit_length[]
assert 9 == [0b1_1011_1000].bit_length[]
2 lớn. Câu trả lời của Jodag cung cấp một sự thay thế thực sự tốt mà chỉ thất bại đối với các số nguyên có thể sẽ làm hỏng máy tính của bạn, nhưng chúng tôi có thể làm tốt hơn một chút và thậm chí nhanh hơn [đối với assert 4 == [0b1111].bit_length[]
assert 8 == [0b1011_1000].bit_length[]
assert 9 == [0b1_1011_1000].bit_length[]
2 đủ nhỏ để assert 4 == [0b1111].bit_length[]
assert 8 == [0b1011_1000].bit_length[]
assert 9 == [0b1_1011_1000].bit_length[]
6 được đảm bảo là chính xác] bằng cách tránh logarit hoàn toàn và sử dụng nhị phân thay thế :and even faster [for assert 4 == [0b1111].bit_length[]
assert 8 == [0b1011_1000].bit_length[]
assert 9 == [0b1_1011_1000].bit_length[]
2 small enough that assert 4 == [0b1111].bit_length[]
assert 8 == [0b1011_1000].bit_length[]
assert 9 == [0b1_1011_1000].bit_length[]
6 is guaranteed to
be accurate] by avoid logarithms altogether and using binary instead:def num_digits[n: int] -> int:
assert n > 0
i = int[0.30102999566398114 * [n.bit_length[] - 1]] + 1
return [10 ** i