Effacement du bit le plus significatif d'un entier


29

Contribution

L'entrée est un seul entier positif n

Sortie

La sortie est navec son bit le plus significatif réglé sur 0.

Cas de test

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

Par exemple: 350en binaire est 101011110. Définir son bit le plus significatif (c'est-à-dire le 1bit le plus à gauche ) pour le 0transformer en 001011110ce qui équivaut à l'entier décimal 94, la sortie. Il s'agit d' OEIS A053645 .


19
Effacer le bit le plus significatif 10donne évidemment 0: D
clabacchio

@clabacchio I .. c'est ... euh ... wha? (gentil)
Baldrickk

12
Il me semble que les zéros sont tout aussi significatifs que ceux. Lorsque vous dites "le bit le plus significatif", vous voulez dire "le bit le plus significatif qui est défini sur un".
Michael Kay

Réponses:


12

C (gcc) , 49 44 40 39 octets

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

Essayez-le en ligne!


1
Vous pouvez remplacer i<=npar n/ipour -1 octet. Ce n'est pas mon golf, quelqu'un d'autre a essayé de le modifier dans votre message, mais je l'ai annulé, car les modifications apportées aux articles de golf ne sont pas acceptées conformément aux règles de notre communauté.
HyperNeutrino

1
@HyperNeutrino J'ai vu et approuvé la modification tout à l'heure. Je n'étais pas au courant de cette règle mais c'est un bon conseil pour le golf!
cleblanc

Ah ok. Ouais, généralement, les gens sont censés poster des commentaires pour des conseils de golf et OP devrait apporter les modifications, mais si vous l'acceptez, ce n'est pas vraiment un problème. :)
HyperNeutrino


9

05AB1E , 5 octets

.²óo-

Essayez-le en ligne!

Retrait du bit le plus significatif d'un nombre entier N est équivalent à trouver la distance à partir de N à la puissance la plus élevée entier de 2 inférieur à N .

Ainsi, j'ai utilisé la formule N - 2 étage (log 2 N) :

  • - Logarithme avec base 2 .
  • ó - Plancher à un entier.
  • o- 2 élevés à la puissance du résultat ci-dessus.
  • - - Différence.

1
b¦Cfonctionne aussi ... n'est-ce pas? Convertir en binaire, MSB est toujours à l'index 1, supprimer MSB, reconvertir.
Urne de poulpe magique

2
@MagicOctopusUrn Non, c'est faux, échoue pour 1!
M. Xcoder

8

Gelée , 3 octets

BḊḄ

Essayez-le en ligne!

Explication

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

2
Ne sont pas et codepoints deux octets? Cela changerait la taille globale à 5 octets.
Bartek Banachewicz du

3
@BartekBanachewicz Jelly utilise sa propre page de codes , où ces caractères ne font que 1 octet.
steenbergh

1
Merci d'avoir posé cette question et d'y avoir répondu, cela me dérange depuis longtemps!
Ukko

8

C (gcc) - 59 octets

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

Cette réponse gcc utilise uniquement des opérations binaires et arithmétiques entières. Pas de logarithmes ici! Il peut avoir des problèmes avec une entrée de 0 et est totalement non portable.

C'est ma première réponse sur ce site, j'aimerais donc avoir des commentaires et des améliorations. Je me suis bien amusé à apprendre des expressions au niveau du bit.


1
Bienvenue chez PPCG, et bonne première réponse! Nous espérons que vous apprécierez de participer à de nombreux autres défis :-)
ETHproductions

Vous n'avez pas besoin d'un programme complet avec main, une fonction est une soumission valide . Changer cela en une fonction et prendre l'entrée comme argument pour cette fonction économise 18 octets .
Steadybox

1
Vous pouvez même l'écrire sous forme de macro pour économiser deux octets supplémentaires .
Steadybox

7

MATL , 8 6 octets

B0T(XB

Essayez-le en ligne!

Enregistré deux octets grâce à Cinaski. Le passage à l'indexation d'affectation au lieu de l'indexation de référence était plus court de 2 octets :)

Explication:

          % 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
Vous auriez pu utiliser l'indexation de référence (également pour 6 octets), si vous l'avez utilisé 4Lplutôt que [2J]. Un autre plaisir 6 octets: tZlcW-(ne fonctionne que dans MATLAB, pas dans TIO / Octave)
Sanchises

6

Java (OpenJDK 8) , 23 octets

n->n^n.highestOneBit(n)

Essayez-le en ligne!

Désolé, intégré: - /


Java avec un build-in que certains autres langages populaires comme .NET et Python n'ont pas?! o.Ô +1 à cela. Était sur le point de publier quelque chose de plus sans build-ins .. Le vôtre est de 15 octets plus court. XD
Kevin Cruijssen

@KevinCruijssen Quelque chose comme ça n->n^1<<(int)Math.log2(n)fonctionnera et est probablement plus court que 38 octets. C'était ma deuxième idée (encore non testée), si celle- highestOneBitci ne fonctionnait pas correctement. Par curiosité, quelle a été votre solution
Olivier Grégoire

Le mien était n->n^1<<(int)(Math.log(n)/Math.log(2))parce qu'il Math.log2n'existe pas en Java. ; P seulement Math.log, Math.log10et Math.loglpsont disponibles.
Kevin Cruijssen

2
J'allais poster le même, seulement moins au lieu de xor.
Rappelé

1
@KevinCruijssen Oups, Math.log2n'existe pas vraiment ... Mon mauvais. Voir? Une belle méthode ( highestOneBit) existe mais pas une autre ( Math.log2). Java est bizarre ;-)
Olivier Grégoire

6

Husk , 3 octets

ḋtḋ

Essayez-le en ligne!

Explication:

    -- 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

De la même manière que pour la solution Jelly, cela semble être en fait 5 octets, pas 3.
Bartek Banachewicz

1
De même @BartekBanachewicz à Jelly, Husk utilise son propre codepage, donc c'est en fait 3 octets: P
HyperNeutrino

@BartekBanachewicz Voir ici pour la page de code: github.com/barbuz/Husk/wiki/Codepage
Laikoni


5

Python 2 , 27 octets

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

Essayez-le en ligne!

Explication

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

... Juste quand je travaillais sur les mathématiques au niveau du bit. : P
totalement humain

@totallyhuman heh désolé mais vous a battu: P
HyperNeutrino

2**len(bin(n))/8peut également être orthographié 1<<len(bin(n))-3, puis il fonctionnera à la fois en 2 et 3 (aucun octet enregistré / ajouté).
Mego

@Mego Cool, merci pour l'ajout!
HyperNeutrino

5

Python 3 , 30 octets

-8 octets grâce à caird coinheringaahing. Je l'ai tapé de mémoire. : o

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

Essayez-le en ligne!



Eh bien, a) ce serait une erreur sur 1 , b) je suis assez stupide pour ne pas y penser. Mais je l'ai corrigé avec un changement mineur. Merci!
totalement humain

J'ai édité le code pour qu'il fonctionne, (et économise 4 octets)
caird coinheringaahing

Cela continue d'erreurs sur 1 .
totalement humain

@cairdcoinheringaahing C'était ma réponse d'origine , mais je me suis alors rendu compte qu'elle s'est trompée sur 1. La solution de contournement se termine plus longtemps qu'une simple méthode XOR
FlipTack


4

JavaScript, 22 20 octets

Sauvegardé 2 octets grâce aux ovs

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

Essayez-le en ligne!

Une autre approche, 32 octets

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

Essayez-le en ligne!


pourquoi feriez-vous .slice`1`^0quand .slice(1)^0travaillerait aussi bien, haha
ETHproductions

@ETHproductions. Celui-ci a l'air mieux :)

4

J, 6 octets

}.&.#:

Assez simple.

Explication

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

J'allais poster ceci :(
Cyoce

@Cyoce Me too ...
Adám

4

APL (Dyalog) , 10 octets

Fonction de préfixe tacite.

212∘⊥⍣¯1

Essayez-le en ligne!

2∘⊥... décodage de base 2 ...
 ... ⍣¯1 temps d'une négative (c. -à- codage en base 2)

1↓ déposez le premier bit

2⊥ décoder à partir de la base-2


4

Rubis, 26 octets

-7 octets grâce à Ventero. -2 octets grâce à l'historicrat.

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

Vous pouvez économiser quelques octets en sautant simplement le premier caractère et en ->n{n.to_s(2)[1..-1].to_i 2}
supprimant les

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

4

C (gcc), 38 octets

Intégré dans gcc utilisé.

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

Le remplacement 31-par ~devrait économiser deux octets.

@ThePirateBay cela dépend du matériel si le décalage est masqué. Sur mon ordinateur, il affichera 0.
Colera Su

4

Ensemble ARM, 46 43 octets

(Vous pouvez omettre le registre de destination lors de l'ajout lorsqu'il est identique à la source)

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

Quelle est la saveur de la syntaxe d'assemblage ARM? Mon assembleur GNU ne comprend pas shr/ shl/ retet veut plutôt quelque chose comme lsr/ lsl/ bx lr.
Ruslan

Mélanger probablement la syntaxe sur plusieurs versions (ret provient de aarch64), bien que je pensais que l'assembleur les pseudo opérerait pour vous. Dans le cas présent, cependant, l'utilisation de l'ancien et du direct lsl / lsr est probablement correcte.
Michael Dorgan

Chose drôle, je peux le faire en 1 opération de moins, mais je la taille d'octet monte de 2. Ah code golf.
Michael Dorgan

3

Pyth, 5 octets

a^2sl

Suite de tests.

Explication:

    l   Log base 2 of input.
   s    Cast ^ to integer (this is the position of the most significant bit.)
 ^2     Raise 2 to ^ (get the value of said bit)
a       Subtract ^ from input

3

Alice , 8 octets

./-l
o@i

Essayez-le en ligne!

Explication

.   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 octets

^2p¢ÊÉ

Essayez-le en ligne!

Explication

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

Si l'entrée 1peut échouer: 4 octets

¢Ån2

Essayez-le en ligne!

Explication : récupérez l'entrée binary ( ¢), coupez le premier char ( Å), analysez le binaire en retour à un nombre ( n2).



3

APL (Dyalog Unicode) , 9 octets

⊢-2*∘⌊2⍟⊢

Essayez-le en ligne!

-1 octet grâce à Adam


Complètement correct, même si j'aurais utilisé TIO pour générer un modèle pour moi. Quoi qu'il en soit, ⊢-2*∘⌊2⍟⊢enregistre un octet.
Adám

J'étais triste qu'APL ne soit pas représenté, et il y en avait, presque perdu dans le parchemin! APL me manque.
cmm

@cmm APL est bel et bien vivant. N'hésitez pas à sortir dans la salle de chat Stack Exchange APL .
Adám

3

CJam , 7 octets

{2b()b}

Essayez-le en ligne!

Explication:

{     }  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

Réutilisez le MSB (qui est toujours 1) pour éviter d'avoir à le supprimer; l'équivalent sans cette astuce serait {2b1>2b}ou {2b(;2b}.


3

Rétine , 15 13 octets

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

Essayez-le en ligne!

Entrée et sortie en unaire (la suite de tests comprend la conversion de et vers décimal pour plus de commodité).

Explication

C'est assez facile à faire en unaire. Tout ce que nous voulons faire, c'est supprimer la plus grande puissance de 2 de l'entrée. Nous pouvons associer une puissance de 2 à quelques références avancées. Il est en fait plus facile de faire correspondre les valeurs du formulaire 2 n -1 , nous allons donc le faire et faire correspondre un 1 séparément:

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

Le groupe 1correspond soit à un simple 1au début pour lancer les choses, soit il correspond à deux fois ce qu'il a fait lors de la dernière itération. Donc ça correspond 1, alors 2, puis 4et ainsi de suite. Étant donné que ceux-ci sont additionnés, nous sommes toujours à court d'une puissance de 2, que nous fixons avec le 1à la fin.

En raison du saut de ligne de fin, la correspondance est simplement supprimée de l'entrée.


3

R , 28 octets

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

Essayez-le en ligne!

Le plus simple pour calculer le bit le plus significatif via 2 ^ floor(log2(x))plutôt que d'effectuer des conversions de base, qui sont assez verbeuses dans R


3

PARI / GP, 18 octets

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

Solution alternative:

n->n-2^exponent(n)

La première semble donner de mauvaises réponses. Devrait-il en être ainsi n->n-2^logint(n,2)? Le second n'est pas pris en charge dans ma version de PARI / GP, ni dans la version utilisée par tio.run . Est-ce une nouvelle fonction?
Jeppe Stig Nielsen

@JeppeStigNielsen Oups, fixe - c'est ce que j'obtiens en soumettant à partir de mon téléphone. Oui, la seconde est une nouvelle fonction.
Charles

@JeppeStigNielsen Je viens de vérifier, a exponentété ajouté il y a 5 jours, par rapport à ce défi qui a été ajouté hier. :)
Charles



3

Excel, 36 31 octets

-5 octets grâce à @ IanM_Matrix1

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

Rien d'interessant.


Réduisez la taille à 31 octets en remplaçant REPLACE par un MID: = BIN2DEC (MID (DEC2BIN (A1), 2,99))
IanM_Matrix1
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.