#информатика #системы_счисления
как подсчитать минимальное количество битов требуемое для десятичных чисел в бинарном коде? Например: 270 или 520
Ответы
Ответ 1
Для целых чисел без знака: взять логарифм по основанию 2 и округлить в большую сторону. n = log2(x+1) log2271 = 8.082 -> 9 бит log2521 = 9.025 -> 10 бит Для представления нуля в памяти всё равно требуется хотя бы 1 битОтвет 2
Если уж говорить о скорости, то некоторые архитектуры (в т.ч. x86) имеют инструкцию, которая считает количество лидирующих нулевых бит. Компилятор GCC имеет её встроенный аналог (обёртку). #includeint main() { std::cout << 32 - __builtin_clz( 270 ) << std::endl; // 9 std::cout << 32 - __builtin_clz( 520 ) << std::endl; // 10 std::cout << 32 - __builtin_clz( 511 ) << std::endl; // 9 std::cout << 32 - __builtin_clz( 512 ) << std::endl; // 10 } Ответ 3
Делим на 2, пока получается число большее единицы, считаем итерации, к результату добавляем 1. Добавляем ещё 1, если число отрицательное.Ответ 4
Предварительно генерируем массив степеней двойки. Cравниваем число со степенями из массива, пока не найдём первое превышающее. Индекс этого числа и есть искомый размер. Вот код и тесты: import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.util.Arrays; import java.util.Collection; @RunWith(Parameterized.class) public class Algorithms { public static int[] powersOfTwo = new int[31]; static { powersOfTwo[0] = 1; for (int power = 1; power < powersOfTwo.length; power++) { powersOfTwo[power] = powersOfTwo[power - 1] * 2; } } @Parameterized.Parameter(0) public int number; @Parameterized.Parameter(1) public int size; @Parameterized.Parameters(name = "number:{0}, size:{1}") public static Collection
Комментариев нет:
Отправить комментарий