Напишите кратчайший код, чтобы изменить порядок бит 32-разрядного целого числа.
Правила:
- Предполагается, что входные данные являются действительными целочисленными или строковыми эквивалентами, если ваш язык не поддерживает числовые значения (например, Windows Batch).
- Выходные данные должны быть действительными целочисленными или строковыми эквивалентами, если ваш язык не поддерживает числовые значения (например, Windows Batch).
- Только стандартная библиотека.
- Это может быть функция или полная программа.
- Ввод может быть либо из,
stdin
либо в качестве аргумента функции. - Вывод должен быть либо
stdout
в виде возвращаемого значения. - Если ваш язык имеет встроенную или стандартную библиотечную функцию, которая делает это за один шаг (например,
rbit
в сборке ARM), это нельзя использовать.
Примеры:
Ключ:
- десятичная дробь
- двоичный
- (задний ход)
- перевернутый двоичный
- десятичный вывод
Примеры:
-90
(8-битный пример для демонстрации)10100110b
- (задний ход)
01100101b
101
486
00000000000000000000000111100110b
- (задний ход)
01100111100000000000000000000000b
1736441856
-984802906
11000101010011010001100110100110b
- (задний ход)
01100101100110001011001010100011b
1704506019
Примечание: пропуски бесплатной игры. Если я этого не сказал, и это не одна из стандартных лазеек , то это полностью разрешено.
Ответы:
сборка x86, 9 байт
В байтовой форме:
33 C0 40 D1 E9 13 C0 73 FA
9 байтов.источник
__fastcall
и не имелret
.MMIX сборка (28 байт)
64-разрядные числа
Это собирает в:
Как это работает?
MOR
Команда выполняет матричное умножение на два 64-битовых величин , используемых в качестве два 8x8 матриц логических значений. В качестве матрицы используется логическое число с цифрами abcdefghklmnopqr 2 :В
MOR
умножают инструкции матрицы представлены их аргументами , где умножениеand
и сложениеor
. Это:и, кроме того:
что является обратным порядком битов исходного числа.
32-разрядные числа
Если вы просто хотите изменить 32-битное число вместо 64-битного, вы можете использовать этот модифицированный метод:
собран:
Первое умножение матриц в основном работает так:
соответствующий октабайт,
#0000000001020408
который мы загружаем в первых двух инструкциях. Второе умножение выглядит так:Соответствующий октабайт
#0102040810204080
мы создаем из первой матрицы следующим образом:Второе умножение является обычным делом, полученный код имеет одинаковую длину (28 байт).
источник
POLY
Инструкция VAX - это, по сути, слияние, умножение и сложение со встроенным циклом. Подобные вещи также существуют в современных архитектурах (например, x86), но они обычно не имеют встроенного цикла для оценки всего полинома сразу.Сборка 80386 (
1312 байт)В качестве функции в синтаксисе AT & T с использованием соглашения о вызовах cdecl.
Эта функция собирается в следующую последовательность байтов:
Разбить на инструкции:
Это работает так: в каждой из 32 итераций цикла аргумент, который находится в
4(%esp)
, смещается вправо на одну позицию. Последний бит неявно сдвигается в флаг переноса.adc
Инструкция добавляет два значения и добавляет значение флага переноса в результате. Если вы добавляете значение к себе, то есть%eax
фактически сдвигаете его влево на одну позицию. Это делаетadc %eax,%eax
удобный способ сдвига влево%eax
на одну позицию, в то же время сдвигая содержимое флага переноса в младший бит.Я повторить этот процесс 32 раз , так что все содержимое
4(%esp)
сбрасывается в%eax
. Я никогда явно не инициализирую,%eax
поскольку его предыдущее содержимое перемещается во время цикла.источник
С
635248Оригинальная версия:
Обновленная версия (с изменениями, предложенными Allbeert , es1024 и Dennis ):
Примечание. Поскольку во второй версии не задано значение
r=0
, в коде предполагается, что значениеint
32 бита. Если это предположение ложно, функция, скорее всего, даст неправильный результат, в зависимости от начального состояния приr
входе в функцию.Окончательная версия (с дальнейшими изменениями, предложенными Денисом и Алхимиком ):
Примечание: это помещает объявление рабочих переменных
r
иi
в список параметров. Параметры следующие:n
это число, которое должно быть инвертировано в битах.r
иi
рабочие переменные, которые должны быть переданы как 0.источник
int
тип функции, а также изменить егоreturn r
на что-то вроде,i=r
так как большинство компиляторов Си, как правило, оставляют результат последней операции в регистре возврата. Он работал на gcc и cl для меня.r(n){...}
вместоr(int n){...}
int
в ,int r=0,i=32;
если вы не переместите их из тела функции.-1 >> 1
является-1
для AS и2**31 - 1
для LS, в то время как-1 / 2
это0
.r
и вi
качестве аргументов? Сохранит еще три байта ...Юлия 0,2, 33 байта
Делает то, на что это похоже.
bits
дает вам представление битов (с учетом дополнения до двух).parseint
не заботится о дополнении до двух, но возвращает 32-битное целое число, поэтому дополнение до двух просто обрабатывается переполнением.Согласно журналам изменений,
parseint
в Julia 0.3 было добавлено обнаружение переполнения , поэтому это может больше не работать.источник
Python 2, 50
Во многом так же, как мое решение Pyth. Возьмите входной мод 2 ** 32, преобразуйте его в 32-разрядный двоичный файл с двоичными данными, переверните, преобразуйте двоичный код обратно в десятичный и напечатайте.
источник
CJam, 15 байтов
Попробуйте онлайн.
Используется джокер «Свободная игра»: на выходе всегда будет целое число без знака .
Контрольные примеры
Как это устроено
источник
JavaScript (E6) 37
39 40 50Функция, ввод номера и возврат обратного номера.
Самый простой алгоритм, вероятно, может быть лучше в гольф с некоторыми хитрыми трюками.Редактировать рекурсию вместо цикла
Изменить 2 Следуя предложению @bebe
k*2
вместоk<<1
Edit 3 Что-то, что я пропустил вообще: это полный 32-битный цикл, нет необходимости инициализировать k. Спасибо @FUZxxl
это было
Тест В консоли FireFox, тестируйте, используя числа в OP и еще несколько случайных 16- и 32-битных чисел
Пример тестового вывода
источник
b=k=0,R=v=>b++<32?R(v>>1,k+=k+(v&1)):k
для однократного использования иR=(v,b=0,k=0)=>b<32?R(v>>1,b+1,k+k+(v&1)):k
многоразового использованияk<<1
становитсяk*2
иv>>1
становитсяv/2
. это работало на 486. Я не знаю о других тестовых случаяхx86 в сборе, 10 байт
Это предполагает ввод в EAX, вывод в EDX. (Кроме того, на выходе eax равно нулю, а CF и ZF установлены, если кому-то нужно).
Вместо счетчика в начале добавляется дополнительный 1 в качестве маркера конца данных
источник
ret
инструкцию для возврата из функции и реализуете cdecl (т.е. изменитеrcr %eax
наrcr 4(%esp)
иrcl %edx
наrcl %eax
), вы получите один дополнительный байт дляret
и еще два байта для ссылки на память. Тем не менее, хорошее решение.J (
171513 байт)Вот явное определение, чтобы объяснить, что он делает:
#: y
представляетy
собой число 2, используя столько мест, сколько необходимо.x {. y
принимает|x
(величинуx
) предметыy
с фронта, еслиx
положительный, со спины, еслиx
отрицательный. Если мы возьмем больше предметов, чем присутствует, результат будет дополнен нулями._32 {. #: y
эффективно дополняет#: y
до 32 бит.|. y
сальтоy
, я. меняет порядок элементов вy
.#. y
интерпретируетy
как число базы-2.источник
Дьялог АПЛ , 10 байт
2⊥
из базы-2 из⌽
обращенный⎕
числовой ввод⊤⍨
в системе счисления, состоящей из32/2
32 битаПопробуй APL онлайн!
источник
Python - 89
Python представляет отрицательные двоичные числа просто
-0b{positive_number}
. Таким образом, чтобы справиться с этим, дополнить отрицательные числа, а затем XOR со всеми 1.После этого создайте строковое представление целого числа на основе формата,
{:032b}
который обеспечивает 32-битное представление числа. Наконец, переверните строку и превратите ее обратно в целое число.РЕДАКТИРОВАТЬ
Благодаря @Martin Büttner за то, что он указал на проблему с дополнительным дополнением. Если
n
заканчивается на 1, то в дополнение к двум обратная версия будет отрицательной.К счастью, как объяснялось выше, Python любит отрицательные двоичные числа довольно простым способом. К счастью,
int
функция Python позволяет использовать необязательные символы знака в своем первом аргументе.Так что теперь, добавьте знак минус, если
n
нечетно, чтобы удовлетворить два дополнения.источник
['','-'][n%2]
есть'-'*(n%2)
.Пиф ,
333222Объяснение:
Гольфы:
33 -> 32: перед добавлением добавлено добавление до сохранения, чтобы сохранить конечную кавычку.
32 -> 22: Использовал Q mod 2 ^ 32 вместо сложной техники. Объединить обе строки в одну.
Тестовые случаи:
источник
GNU dc, 27 байт
Выход:
Bash + coreutils, 45 байт
Выход:
Функция C, 89 байт
Идея та же, что и у /codegolf//a/36289/11259 - использование стэнфордских хитов твидлинга . Не собираюсь выигрывать в гольф, но тем не менее интересно:
Выход:
источник
Функция Java, 64 символа.
Также должен работать в C.
источник
PHP, 46 байт
Онлайн версии
или
источник
substr
Ненужно (-12 байт). Вы должны упомянуть, как их запустить.-984802906
?<?=bindec(strrev(sprintf("%064b",$argn<<32)));
JS 115
Ну, это выглядит не очень хорошо: D
Метод @Florian F в JS имеет длину 53 байта:
источник
it may be a function
средства правило вам не нужно предупреждение или быстроеC #
8174Битовые операции, которые, скорее всего, можно сделать короче на всех языках программирования.
По сути, перебираем все степени от 2 до целых максимумов + 1 (что превращается в степень двух) и, поскольку (2 147 483 647 + 1) = 0, я могу зациклить до 0. Сдвиг бита Слева направо, чтобы переместить бит в первый позиция. Последний бит на месте 32 идет на 31 шаг вправо, второй последний идет на 30 и т. Д. Поэтому, используя оператор AND с 1, я узнаю, равен ли он 1 или 0. Если это 1, я добавлю текущее значение i к результату и верни это.
источник
i
когда вы объявляете это, и сохранять байт, удаляяi++
из цикла for, и вместо сравнения результата1&...
с 0 вы можете полностью удалить оператор if и умножитьi
на результат, передаваемыйr|=i*(1&(V>>(31-l++)));
в циклеC # 142
расширенный
источник
Python - 37
Похоже на решение @ isaacg.
источник
С ++, 160
Это не самый короткий, однако он использует только 24 операции.
Взято из книги Восторг Хакера.
Golfed:
Ungolfed:
источник
Haskell, 145 - без побитовых операций
Бит-тиддлинг кажется мне полной противоположностью Haskell, поэтому я избегаю использования битовых операторов. Получившаяся программа, конечно, не самая короткая, но я подумал, что использование математики вместо бит-тиддлинга было по крайней мере интересно.
объяснение
0
s и1
s, сначала младший значащий бит путем многократного деления на 2 и взятия остатка0
s до конца этого списка0
и1
в целое число, предполагая, что самый старший бит - первый (повторяется дважды и добавляет).Я не совсем уверен, что составляет «стандартную библиотеку» в Haskell, поэтому я предположил, что Data.Tuple и Data.List были в порядке (они довольно стандартны).
Кроме того, выходные данные представляют собой 32-разрядное целое число без знака после изменения, которое обойдется мне в байтах: я утверждаю это в разделе «упущения - бесплатная игра».
источник
PHP,
4641 байтпопробуйте их онлайн
поразрядно ... более или менее. Беги как труба с
php -nR '<code>'
.PHP, 46 байт
чисто побитовое решение; беги как труба с
-nR
.PHP,
4759 байтдругой встроенный подход; сохранить в файл и запустить как канал с
-F
.источник
Perl - 60
+1 за флаг p (дайте мне знать, если я считаю это неправильно).
Бежать с:
источник
C ++ 69
источник
e;i;
? Объявления без типа не являются допустимым C ++. Для переменных это даже не верно C.int r(int n){int e=0,i=0;for(;i<32;)e=e*2|1&n>>i++;return e;}
61 байт :)Р, 45
Примеры:
Всегда просто стесняюсь ответов Python. Это чертово ключевое слово функции.
источник
Рубин,
4341 байтdef r(n)(0..31).inject(0){|a,b|a*2+n[b]}end
В Ruby использование обозначения индекса в скобках (foo [i]) возвращает бит на n-м месте.
--Редактировать--
Рефакторинг
inject
функциональности сбивает пару байтовdef r(n)z=0;32.times{|i|z=z*2+n[i]};z;end
источник
Perl5: 46
Ничего фантастического. Он сдвигает вывод влево, копирует lsb перед сдвигом источника вправо.
источник
Clojure,
202156142источник
Perl (37 + 1)
в основном порт решения C от Тодда Лемана
perl -E '$t=<>;map$r=2*$r|1&$t>>$_,0..31;say$r'
источник