Для любого положительного 32-разрядного целого числа ( 1 ≤ n ≤ 0xFFFFFFFF
) выведите количество бит, необходимое для представления этого целого числа.
Контрольные примеры
| n | n in binary | bits needed |
|----------------------------------|
| 1 | 1 | 1 |
| 2 | 10 | 2 |
| 3 | 11 | 2 |
| 4 | 100 | 3 |
| 7 | 111 | 3 |
| 8 | 1000 | 4 |
| 15 | 1111 | 4 |
| 16 | 10000 | 5 |
| 128 | 10000000 | 8 |
| 341 | 101010101 | 9 |
4294967295 => 11111111111111111111111111111111 => 32
Так f(16)
бы распечатать или вернуть5
Это код-гольф . Самый короткий код в байтах выигрывает
floor(log2(num))+1
num
это сила двух.Ответы:
05AB1E , 2 байта
Попробуйте онлайн!
источник
bg
bg
.bg
в игровых средствахbad game
:)JavaScript (ES6), 18 байт
источник
n>>>1
поддерживатьn > 0x7FFFFFFF
?>>
провалился наn
такой высоте. Благодарю.f=(a,b=1)=>a>1?f(a>>1,++b):b
Сборка x86, 4 байта
Принимая константу в
EBX
:EAX содержит количество битов, необходимых для константы.
Б:
☼¢├@
Hexadecimal:
['0xf', '0xbd', '0xc3', '0x40']
источник
Python , 14 байт
Попробуйте онлайн!
источник
bit_length
естьbit_length()
.int.bit_length(n)
иn.bit_length()
делать то же самое.int.bit_length(n)
- это вызов функции , и, следовательно, фрагмент, который предполагает, что входные данные хранятся в переменной. Это не разрешено нашими правилами, поэтому добавление(n)
сделает этот ответ недействительным. Однакоint.bit_length
оценивает функцию и может быть сохранен в переменной для дальнейшего использования. Это разрешено по умолчанию.Лабиринт ,
1312 байтПопробуйте онлайн!
объяснение
Программа просто многократно делит ввод на 2 до нуля. Количество шагов отслеживается путем дублирования значения на каждом шаге. Как только оно уменьшено до нуля, мы печатаем глубину стека (минус 1).
Программа начинается с того,
?
что читает ввод. Основной цикл - это блок 2х2 ниже, идущий против часовой стрелки:Когда значение равно нулю после полной итерации, выполняется линейный бит в конце:
источник
C, 31 байт
... Тогда я подумал о рекурсии. От неясного к очевидному, и с одной четвертой длины отпадает.
Посмотрите это в прямом эфире на Coliru
C, 43 байтаВызов
f
с беззнаковым значением (напримерf(42u)
) вернет его битовую длину. Даже работает на0u
!Развернул и объяснил: (обратная косая черта опущена)
Посмотрите это в прямом эфире на Coliru
источник
n?...:0
не является необходимым.#define f(n) ({64-__builtin_clzl(n);})
подход.Mathematica, 9 байт
В качестве альтернативы:
источник
Perl 6 , 7 байт
Попробуй
Объяснение:
*
превращает его в лямбду-бы то ни было и указывает, куда поместить вход.msb
по Int возвращает индекс старшего значащего бита (на основе 0)+1
объединяется в лямбду и добавляет единицу к конечному результату вызова.msb
.источник
Макрос препроцессора C (с расширениями gcc), 26
Использует встроенные в GCC счетчики ведущих нулей .
Вызовите это как функцию, например
f(100)
.Попробуйте онлайн .
источник
Retina ,
5637 байтЭто решение работает со всеми необходимыми входными значениями.
Самая большая проблема, с которой Retina сталкивается в этой задаче, заключается в том, что ее строки имеют максимальную длину 2 ^ 30 символов, поэтому обычный способ работы с числами (унарное представление) не работает со значениями, превышающими 2 ^ 30.
Чтобы решить эту проблему, я принял другой подход, сохраняя своего рода десятичное представление чисел, но где каждая цифра пишется в унарном порядке (я назову это представление цифрой ). Например, число
341
будет написано как111#1111#1#
в цифре. С этим представлением мы можем теперь работать с числами до2^30/10
цифр (~ сто миллионов цифр). Это менее практично, чем стандартное унарное для произвольной арифметики, но, приложив немного усилий, мы могли бы выполнять любые операции.Алгоритм, который я использовал, состоит в том, чтобы делить последовательные целочисленные деления на два, пока мы не достигнем нуля, число делений, которое мы сделали, - это количество битов, необходимое для представления этого числа.
Итак, как мы можем разделить на два в цифре? Вот фрагмент Retina, который делает это:
Этой замены достаточно, чтобы разделить цифровое число на 2, нам просто нужно удалить возможные .5 с конца, если исходное число было нечетным.
Итак, вот полный код, мы продолжаем делить на два до тех пор, пока в числе не останутся цифры, и ставим литерал
n
перед строкой на каждой итерации: числоn
в конце является результатом.Попробуйте онлайн!
Обновленное решение, 37 байт
Большой рефакторинг с множеством хороших идей, которые играли в гольф примерно на треть длины, все благодаря Мартину Эндеру!
Основная идея состоит в том, чтобы использовать в
_
качестве нашего унарного символа: таким образом, мы можем использовать обычные цифры в нашей строке, если мы преобразуем их обратно в_
s, когда это необходимо: это позволяет нам экономить много байтов при делении и вставке нескольких цифры.Вот код:
Попробуйте онлайн!
источник
Рубин,
1916 байтСпасибо Джордан за игру в гольф 3 байта
источник
%
:->n{("%b"%n).size}
.->n{"%b"%n=~/$/}
.Джольф, 2 байта
Просто преобразуйте в двоичный файл, а затем найдите длину.
источник
Юлия 0,4 , 14 байт
Попробуйте онлайн!
источник
JavaScript ES6, 19 байт
Math.clz32
возвращает число начальных нулевых битов в 32-битном двоичном представлении числа. Таким образом, чтобы получить необходимое количество бит, нам нужно только вычесть это число из 32источник
a=>1+Math.log2(a)|0
также 19 байтов.1+...|0
кричит минус тильда !a=>-~Math.log2(a)
18 летинструменты bash / Unix, 16 байт
Сохраните это в сценарии и передайте входные данные в качестве аргумента. Количество битов, необходимых для представления этого числа в двоичном виде, будет напечатано.
Вот объяснение:
dc - это стековый калькулятор. Его вход, разобранный в токены, является:
2 - Нажмите 2 в стеке.
o - вытолкнуть значение из стека (которое равно 2) и сделать его выходной базой (поэтому вывод теперь в двоичном виде).
Значение аргумента для программы bash ($ 1) - поместить этот аргумент в стек.
n - вытолкнуть значение из стека (которое является входным числом) и распечатать его (в двоичном виде, потому что это выходная база) без завершающего символа новой строки.
Таким образом, команда dc выводит число в двоичном виде.
Вывод dc передается в команду wc с опцией -c, которая печатает количество символов на входе.
Конечным результатом является печать числа цифр в двоичном представлении аргумента.
источник
Google Sheets, 15 байт
Принимает ввод из ячейки
A1
и выводит в ячейку, которая содержит формулуили же
или же
Excel, 17 байт
То же, что и выше, но отформатировано для MS Excel
или же
или же
источник
Pyth, 3 байта
Тестовый набор доступен здесь.
объяснение
источник
hsl
или.El
, в которомl
вычисляется лог-база 2, и /hs
или.E
вычисляется потолок.Желе, 2 байта
Преобразует в двоичный файл, находит длину.
источник
C #,
634531 байтСохранено 18 байт, благодаря Loovjo и TuukkaX
Сохранено 14 байт, благодаря Grax
Он использует, что десятичное число n имеет ⌊log2 (n) ⌋ + 1 бит, что описано на этой странице:
источник
...)+ 1)...
->...)+1...
. Кроме того, я думаю, что вы можете вернуть значение напрямую, а не распечатывать его.b=>1+(int)System.Math.Log(b,2);
Преобразование int, которое выдает тот же результат, что и Math.Floor, и вам не нужен оператор using, если вы только один раз ссылаетесь на System.C #, 32 байта
Преобразует параметр в двоичную строку и возвращает длину строки.
источник
Haskell, 20 байтов
Составляет функцию, которая берет логарифм основания 2, этажи и добавляет 1.
источник
Befunge-93 ,
2321 байтBefunge - это двумерный сеточный язык (хотя я использую только одну строку).
Попробуйте онлайн!
источник
Медуза , 4 байта
Попробуйте онлайн!
Print (
p
), длина (#
) двоичного представления (b
) ввода (i
).источник
CJam , 5 байтов
Попробуйте онлайн!
Прочитать input (
r
), преобразовать в integer (i
), получить двоичное представление (2b
), получить length (,
).источник
Октава , 19 байт
Анонимная функция, которая добавляет 1, вычисляет двоичный логарифм и округляет.
Попробуйте онлайн!
источник
QBIC , 18 байт
Это невероятно, Майк! Но как это работает?
источник
Java 8,
3427 байтНа этот раз в Java есть несколько полезных встроенных функций! Теперь нам просто нужны короткие имена ...
Попробуйте онлайн!
Конечно, вы можете сделать это без встроенных функций ( см. Ответ Snowman ), но для большего количества байтов.
источник
Октава, 19 байт
Octave имеет две функции для преобразования десятичных чисел в двоичные числа.
dec2bin
преобразует число в строку символов1
и0
(ASCII-значения48
и49
). Длина строки будет равна необходимому количеству битов, если не указано иное. Так как символы1
и0
отличен от нуля, мы можем использовать ,nnz
чтобы найти число элементов , как это:@(x)nnz(dec2bin(x))
. Это 19 байтов, так что это связано с другим ответом Луиса Мендо на октаву .Можем ли мы сделать лучше, используя
de2bi
?de2bi
это функция, которая возвращает двоичные числа в виде вектора с числами1
и в0
виде целых чисел, а не символов.de2bi
очевидно, на два байта корочеdec2bin
, но мы больше не можем использоватьnnz
. Мы можем использовать,nnz
если мы либо добавляем1
ко всем элементам, либо превращаем его в логический вектор только сtrue
значениями.@(x)nnz(de2bi(x)+1)
и@(x)nnz(de2bi(x)<2)
оба 19 байтов. Использованиеnumel
также даст нам 19 байтов@(x)numel(de2bi(x))
.rows
на один байт корочеnumel
, ноde2bi
возвращает горизонтальный вектор, поэтому он должен быть транспонирован.@(x)rows(de2bi(x)')
просто так бывает и 19 байт.источник
Пайк, 3 байта
Попробуй это здесь!
источник
Retina ,
4423 байтаТребуется слишком много памяти для больших входных значений. Преобразует в унарный, затем многократно делит на 2, считая, сколько раз, пока он не достигнет нуля. Количество байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн
источник