Очистка наиболее значимого бита от целого числа


29

вход

Ввод одно целое положительное число n

Выход

Выход nс наиболее значимым битом установлен в 0.

Тестовые случаи

1 -> 0
2 -> 0
10 -> 2
16 -> 0
100 -> 36
267 -> 11
350 -> 94
500 -> 244

Например: 350в двоичном есть 101011110. Установка его старшего значащего бита (т. Е. Самого левого 1бита) для 0преобразования его в выход, 001011110эквивалентный десятичному целому 94числу Это OEIS A053645 .


19
Очистка самого значительного бита от 10явно дает 0: D
клабаккио

@clabacchio Я .. это ... э ... как? (хороший)
Baldrickk

12
Мне кажется, что нули так же значимы, как и нули. Когда вы говорите «старший значащий бит», вы имеете в виду «старший значащий бит, установленный в единицу».
Майкл Кей,

Ответы:


12

C (gcc) , 49 44 40 39 байт

i;f(n){for(i=1;n/i;i*=2);return n^i/2;}

Попробуйте онлайн!


1
Вы можете заменить i<=nс n/iна -1 байт. Это не мой гольф, кто-то еще пытался отредактировать его в вашем сообщении, но я откатил его, потому что изменения для сообщений о гольфе не принимаются в соответствии с правилами нашего сообщества.
HyperNeutrino

1
@HyperNeutrino Я видел и одобрил редактирование только сейчас. Не знал об этом правиле, но это хороший совет для игры в гольф!
cleblanc

Ах хорошо. Да, обычно люди должны оставлять комментарии для советов по игре в гольф, а ОП должны вносить изменения, но если вы согласились, это не такая большая проблема. :)
HyperNeutrino


9

05AB1E , 5 байтов

.²óo-

Попробуйте онлайн!

Удаление наиболее значимый бит из целых чисел N эквивалентно нахождению расстояния от N до самого высокого целой степени 2 ниже , чем N .

Таким образом, я использовал формулу N - 2 этажа (log 2 N) :

  • - Логарифм с основанием 2 .
  • ó - Пол до целого числа.
  • o- 2 возведены в степень результата выше.
  • - - Разница

1
b¦Cтоже работает ... не так ли? Преобразовать в двоичный файл, MSB всегда находится в индексе 1, удалить MSB, преобразовать обратно.
Волшебная Урна Осьминога

2
@MagicOctopusUrn Нет, это не так, не получается 1!
г-н Xcoder

8

Желе , 3 байта

BḊḄ

Попробуйте онлайн!

объяснение

BḊḄ  Main Link
B    Convert to binary
 Ḋ   Dequeue; remove the first element
  Ḅ  Convert from binary

2
Не является и два байта кодовых? Это изменит общий размер до 5 байтов.
Бартек Банахевич

3
@BartekBanachewicz Jelly использует свою собственную кодовую страницу , где эти символы только 1 байт.
Steenbergh

1
Спасибо, что спросили и ответили на это, это меня долго раздражало!
Ukko

8

C (gcc) - 59 байтов

main(i){scanf("%d",&i);return i&~(1<<31-__builtin_clz(i));}

Этот ответ gcc использует только целочисленные побитовые и арифметические операции. Здесь нет логарифмов! У него могут быть проблемы с вводом 0, и он полностью непереносим.

Это мой первый ответ на этом сайте, поэтому я хотел бы получить отзывы и улучшения. Я, конечно, весело проводил время с изучением побитовых выражений.


1
Добро пожаловать в PPCG и отличный первый ответ! Мы надеемся, что вам понравится участвовать во многих других задачах :-)
ETHproductions

Вам не нужна полная программа main, функция является верным представлением . Преобразование этого в функцию и принятие ввода в качестве аргумента указанной функции экономит 18 байт .
Steadybox

1
Вы могли бы даже написать это как макрос, чтобы сохранить еще два байта .
Steadybox

7

MATL , 8 6 байт

B0T(XB

Попробуйте онлайн!

Сохранено два байта благодаря Cinaski. Переключение на индексацию присваивания вместо индексации ссылок было на 2 байта короче :)

Объяснение:

          % Grab input implicitly: 267
B         % Convert to binary: [1 0 0 0 0 1 0 1 1]
 0T(      % Set the first value to 0: [0 0 0 0 0 1 0 1 1]
    XB    % Convert to decimal: 11

1
Вы могли бы использовать индексирование ссылок (также для 6 байтов), если бы вы использовали 4Lвместо [2J]. Еще один забавный 6 байт: tZlcW-(работает только в MATLAB, а не в TIO / Octave)
Sanchises

6

Java (OpenJDK 8) , 23 байта

n->n^n.highestOneBit(n)

Попробуйте онлайн!

Извините, встроенный: - /


Java со встроенной программой, которой нет в некоторых других популярных языках, таких как .NET и Python ?! +1 +1 к этому. Собирался публиковать что-то дольше без встроенных модулей .. У вас на 15 байт короче XD
Кевин Круйссен

@KevinCruijssen Нечто подобное n->n^1<<(int)Math.log2(n)будет работать и, вероятно, короче, чем 38 байтов. Это была моя вторая (пока не проверенная) идея, если highestOneBitона не работает должным образом. Из любопытства, каково было ваше решение
Оливье Грегуар

Мой был, n->n^1<<(int)(Math.log(n)/Math.log(2))потому Math.log2что не существует в Java. ; P только Math.log, Math.log10и Math.loglpдоступны.
Кевин Круйссен

2
Я собирался выложить то же самое, только минус вместо xor. Вспомнил метод из этого
JollyJoker

1
@KevinCruijssen Ой, Math.log2на самом деле не существует ... Мой плохой. Видеть? highestOneBitСуществует один хороший метод ( ), но нет другого ( Math.log2). Ява странная ;-)
Оливье Грегуар

6

Шелуха , 3 байта

ḋtḋ

Попробуйте онлайн!

Объяснение:

    -- implicit input, e.g. 350
  ḋ -- convert number to list of binary digits (TNum -> [TNum]): [1,0,1,0,1,1,1,1,0]
 t  -- remove first element: [0,1,0,1,1,1,1,0]
ḋ   -- convert list of binary digits to number ([TNum] -> TNum): 94

Подобно решению Jelly, похоже, что на самом деле это 5 байтов, а не 3.
Bartek Banachewicz

1
@BartekBanachewicz Как и Jelly, Husk использует собственную кодовую страницу, так что на самом деле это 3 байта: P
HyperNeutrino

@BartekBanachewicz См. Здесь для кодовой страницы: github.com/barbuz/Husk/wiki/Codepage
Laikoni


5

Python 2 , 27 байт

lambda n:n-2**len(bin(n))/8

Попробуйте онлайн!

объяснение

lambda n:n-2**len(bin(n))/8  # Lambda Function: takes `n` as an argument
lambda n:                    # Declaration of Lambda Function
              len(bin(n))    # Number of bits + 2
           2**               # 2 ** this ^
                         /8  # Divide by 8 because of the extra characters in the binary representation
         n-                  # Subtract this from the original

... Как раз когда я работал над битовой математикой. : P
полностью человек

@totallyhuman хе, извините, но я вас побил: P
HyperNeutrino

2**len(bin(n))/8также может быть написано 1<<len(bin(n))-3, и тогда он будет работать как 2 и 3 (без сохранения / добавления байтов).
Mego

@Mego Круто, спасибо за добавление!
HyperNeutrino

5

Python 3 , 30 байт

-8 байт благодаря caird. Я набрал это по памяти. : о

lambda n:int('0'+bin(n)[3:],2)

Попробуйте онлайн!



Ну, а) это было бы ошибкой на 1 , б) Я достаточно глуп, чтобы не думать об этом. Но я исправил это с небольшим изменением. Благодарность!
полностью человек

Я отредактировал код так, чтобы он работал (и
сохранял

Это все еще ошибки на 1 .
полностью человек

@cairdcoinheringaahing Это был мой первоначальный ответ , но потом я понял, что он ошибся в 1. Обходной путь заканчивается дольше, чем простой метод XOR
FlipTack


4

JavaScript, 22 20 байт

Сохранено 2 байта благодаря ovs

a=>a^1<<Math.log2(a)

Попробуйте онлайн!

Другой подход, 32 байта

a=>'0b'+a.toString`2`.slice`1`^0

Попробуйте онлайн!


почему бы тебе это сделать, .slice`1`^0если .slice(1)^0бы сработало так же хорошо, ха-ха
ETHproductions

@ETHproductions. Этот выглядит лучше :)

4

J, 6 байт

}.&.#:

Довольно просто

объяснение

}.&.#:
    #:  convert to list of binary digits
  &.    apply right function, then left, then the inverse of right
}.      behead

Я собирался опубликовать это :(
Cyoce

@ Ты тоже меня ...
Адам

4

APL (Dyalog) , 10 байт

Функция молчаливого префикса.

212∘⊥⍣¯1

Попробуйте онлайн!

2∘⊥... декодировать из базы-2 ...
 ... ⍣¯1 отрицательно один раз (т.е. кодировать в базе-2)

1↓ брось первый бит

2⊥ декодировать с базы-2


4

Рубин, 26 байт

-7 байт благодаря Ventero. -2 байта благодаря исторират.

->n{/./=~'%b'%n;$'.to_i 2}

Вы можете сэкономить несколько байтов, просто пропустив первый символ и опустив лишние скобки:->n{n.to_s(2)[1..-1].to_i 2}
Ventero

->n{/./=~'%b'%n;$'.to_i 2}
гистократ

4

C (gcc), 38 байт

Встроенный в GCC используется.

f(c){return c^1<<31-__builtin_clz(c);}

Замена 31-на ~должна сохранить два байта.

@ThePirateBay зависит от оборудования, маскируется ли смещение. На моем компьютере он выдаст 0.
Colera Su

4

Сборка ARM, 46 43 байта

(Вы можете опустить регистр назначения при добавлении, если он совпадает с исходным)

clz x1,x0
add x1,1
lsl x0,x1
lsr x0,x1
ret

Что это за синтаксис сборки ARM? Мой ассемблер GNU не понимает shr/ shl/ retи вместо этого хочет что-то вроде lsr/ lsl/ bx lr.
Руслан

Вероятно, смешивание синтаксиса между несколькими версиями (ret от aarch64), хотя я думал, что ассемблер подойдет для вас. Тем не менее, использование здесь более старого и прямого lsl / lsr, вероятно, является правильным.
Майкл Дорган

Забавно, я могу сделать это за 1 операцию меньше, но я увеличиваю размер байта на 2.
Майкл Дорган


3

Алиса , 8 байт

./-l
o@i

Попробуйте онлайн!

объяснение

.   Duplicate an implicit zero at the bottom of the stack. Does nothing.
/   Switch to Ordinal mode, move SE.
i   Read all input as a string.
l   Convert to lower case (does nothing, because the input doesn't contain letters).
i   Try reading all input again, pushes an empty string.
/   Switch to Cardinal mode, move W.
.   Duplicate. Since we're in Cardinal mode, this tries to duplicate an integer.
    To get an integer, the empty string is discarded implicitly and the input is 
    converted to the integer value it represents. Therefore, at the end of this,
    we get two copies of the integer value that was input.
l   Clear lower bits. This sets all bits except the MSB to zero.
-   Subtract. By subtracting the MSB from the input, we set it to zero. We could
    also use XOR here.
/   Switch to Ordinal, move NW (and immediately reflect to SW).
o   Implicitly convert the result to a string and print it.
/   Switch to Ordinal, move S.
@   Terminate the program.

3

Japt , 6 байт

^2p¢ÊÉ

Попробуйте онлайн!

объяснение

^2p¢ÊÉ
   ¢     Get binary form of input
    Ê    Get length of that
     É   Subtract 1
 2p      Raise 2 to the power of that
^        XOR with the input

Если ввод 1может быть неудачным: 4 байта

¢Ån2

Попробуйте онлайн!

Объяснение : получить входные данные binary ( ¢), вырезать первый символ char ( Å), проанализировать как двоичный код обратно в число ( n2).



3

APL (Dyalog Unicode) , 9 байтов

⊢-2*∘⌊2⍟⊢

Попробуйте онлайн!

-1 байт благодаря Адаму


Совершенно верно, хотя я бы использовал TIO для создания шаблона для меня. Во всяком случае, ⊢-2*∘⌊2⍟⊢сохраняет байт.
Адам

Мне было грустно, что APL не было представлено, и было, почти потеряно в свитке! Я скучаю по APL.
CMM

@cmm APL жив и здоров. Не стесняйтесь тусоваться в чате Stack Exchange APL .
Адам

3

CJam , 7 байтов

{2b()b}

Попробуйте онлайн!

Объяснение:

{     }  Block:         267
 2b      Binary:        [1 0 0 0 0 1 0 1 1]
   (     Pop:           [0 0 0 0 1 0 1 1] 1
    )    Increment:     [0 0 0 0 1 0 1 1] 2
     b   Base convert:  11

Повторно используйте MSB (который всегда равен 1), чтобы избежать необходимости его удаления; эквивалент без этого трюка будет {2b1>2b}или {2b(;2b}.


3

Сетчатка , 15 13 байт

^(^1|\1\1)*1

Попробуйте онлайн!

Ввод и вывод в одинарный (набор тестов включает в себя преобразование из и в десятичное для удобства).

объяснение

Это довольно легко сделать в одинарном. Все, что мы хотим сделать, это удалить наибольшую степень 2 из входных данных. Мы можем сопоставить степень 2 с некоторыми ссылками вперед. На самом деле проще сопоставить значения в форме 2 n -1 , поэтому мы сделаем это и сопоставим одно 1 отдельно:

^(^1|\1\1)*1

Группа 1либо совпадает с единичным 1в начале, либо с двойным совпадением, чем на последней итерации. Так что это соответствует 1, тогда 2, тогда 4и так далее. Так как они складываются, у нас всегда есть одна степень от 2, которую мы исправляем 1в конце.

Из-за завершающего перевода строки совпадение просто удаляется из ввода.


3

R , 28 байт

function(x)x-2^(log2(x)%/%1)

Попробуйте онлайн!

Проще всего вычислить старший значащий бит, 2 ^ floor(log2(x))а не выполнять базовые преобразования, которые довольно многословны в R


3

PARI / GP, 18 байт

n->n-2^logint(n,2)

Альтернативное решение:

n->n-2^exponent(n)

Первый, кажется, дает неправильные ответы. Должно ли это быть n->n-2^logint(n,2)? Второй вариант не поддерживается ни в моей версии PARI / GP, ни в версии, используемой tio.run . Это новая функция?
Джеппе Стиг Нильсен

@JeppeStigNielsen Упс, исправлено - вот что я получаю за отправку с моего телефона. Да, вторая функция новая.
Чарльз

@JeppeStigNielsen Я только что проверил, exponentбыл добавлен 5 дней назад, по сравнению с этим вызовом, который был добавлен вчера. :)
Чарльз

3

Haskell , 32 29 байт

(!1)
x!y|2*y>x=x-y|z<-2*y=x!z

Попробуйте онлайн!

-3 байта благодаря @Laikoni

Старое решение, 32 байта

f x=last[x-2^i|i<-[0..x],2^i<=x]

Попробуйте онлайн!


1
Разрешены анонимные функции, поэтому вам не нужно f=использовать первый вариант. Дополнительно z<-2*y=x!zсохраняет байт: попробуйте онлайн!
Лайкони


3

Excel, 36 31 байт

-5 байт благодаря @ IanM_Matrix1

=BIN2DEC(MID(DEC2BIN(A1),2,99))

Ничего интересного.


Уменьшите размер до 31 байта, заменив REPLACE на MID: = BIN2DEC (MID (DEC2BIN (A1), 2,99))
IanM_Matrix1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.