整数から最上位ビットをクリアする


29

入力

入力は単一の正の整数です n

出力

出力のn最上位ビットはに設定されてい0ます。

テストケース

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

たとえば350、バイナリでは101011110です。その最上位ビット(すなわち、左端の設定1にビットを)0それが変身00101111010進数に相当する94、出力。これはOEIS A053645です。


19
から最も重要なビットをクリアすると、10明らかに次のようになります0:D
clabacchio

@clabacchio I .. it ... er ... wha?(素敵な1)
Baldrickk

12
ゼロはゼロと同じくらい重要であるように思えます。「最上位ビット」と言うとき、「1に設定されている最上位ビット」を意味します。
マイケルケイ

回答:


12

C(gcc)49 44 40 39バイト

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

オンラインでお試しください!


1
あなたは置き換えることができi<=nn/iために-1バイト。これは私のゴルフではありません。他の誰かがあなたの投稿に編集しようとしましたが、ゴルフの投稿の編集はコミュニティのルールに従って受け入れられないため、ロールバックしました。
ハイパーニュートリノ

1
@HyperNeutrino私は今編集を見、承認しました。そのルールを認識していませんでしたが、それは素晴らしいゴルフのヒントです!
cleblanc

あ、そう。ええ、通常、人々はゴルフのヒントについてコメントを投稿することになっているので、OPは編集を行うべきですが、それを受け入れたとしても、それほど大きな問題ではありません。:)
HyperNeutrino


9

05AB1E、5バイト

.²óo-

オンラインでお試しください!

整数の最上位ビットを除去し、Nはから距離発見に相当するNの最高整数乗に2よりも低いNを

したがって、式N-2 floor(log 2 N)を使用しました

  • -2を底とする対数。
  • ó -整数へのフロア。
  • o- 2以上の結果乗。
  • - -違い。

1
b¦Cまた動作します...そうではありませんか?バイナリに変換すると、MSBは常にインデックス1になり、MSBを削除して、元に戻します。
魔法のタコUr

2
@MagicOctopusUrnいいえ、間違っています、失敗し1ます!
ミスターXcoder

8

ゼリー、3バイト

BḊḄ

オンラインでお試しください!

説明

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

2
ていない2バイトのコードポイントは?これにより、全体のサイズが5バイトに変更されます。
Bartek Banachewicz

3
@BartekBanachewicz Jellyは独自のコードページを使用します。これらの文字は1バイトのみです。
-steenbergh

1
これを尋ねて答えてくれてありがとう、それは長い間私を悩ませてきました!
ウッコ

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
さらに2バイト節約するマクロとして記述することもできます
Steadybox

7

MATL8 6バイト

B0T(XB

オンラインでお試しください!

Cinaskiのおかげで2バイト節約されました。参照インデックスの代わりに割り当てインデックスに切り替えると、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)

オンラインでお試しください!

申し訳ありませんが、組み込みの:-/


.NETやPythonなどの他の一般的な言語にはないビルトインJava o.Ô+1。組み込みなしで長いものを投稿しようとしていました。あなたのものは15バイト短くなりました。XD
ケビンクルーッセン

@KevinCruijssenのようなものn->n^1<<(int)Math.log2(n)が機能し、おそらく38バイトよりも短くなります。それがhighestOneBit適切に機能しなかった場合、それは私の2番目の(まだテストされていない)アイデアでした。好奇心から、あなたの解決策は何だった
オリヴィエグレゴワール

私のn->n^1<<(int)(Math.log(n)/Math.log(2))理由Math.log2は、Javaには存在しないからです。; PのみMath.logMath.log10およびMath.loglp利用可能です。
ケビンCruijssen

2
xorの代わりにマイナスだけを投稿するつもりでした。この
-JollyJoker

1
@KevinCruijssenおっと、Math.log2実は存在しません...私の悪い。見る?ある素敵なメソッド(highestOneBit)がありますが、別のメソッド()はありませんMath.log2。Javaは奇妙です;-)
オリビエグレゴワール

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ソリューションと同様に、これは実際には3バイトではなく5バイトのようです。
BartekBanachewicz

1
@BartekBanachewicz同様ゼリーに、殻は、独自のコードページを使用するため、これがあり、実際に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 Cool、追加してくれてありがとう!
ハイパーニュートリノ

5

Python 3、30バイト

ケアード・コイナーリンガーのおかげで-8バイト。メモリから入力しました。:o

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

オンラインでお試しください!



まあ、a)1でエラーになります、b)私はそれを考えないほど愚かです。しかし、小さな変更を加えて修正しました。ありがとう!
完全に人間

私はそれが動作するように、コードを編集した(4つのバイトを保存します)しました
coinheringaahing caird

それでも1でエラーが発生します。
完全に人間

それ@cairdcoinheringaahingは私だったオリジナルの答えが、その後、私はそれが回避策は、単純なXOR方式よりも長くなってしまう。1.上でエラーが発生した実現
FlipTack



4

J、6バイト

}.&.#:

ものすごく単純。

説明

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

私はこれを投稿するつもりだった:(
Cyoce

@Cyoce Me
...-アダム


4

ルビー、26バイト

-7バイトはVenteroのおかげです。-historyratのおかげで2バイト。

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

最初の文字をスキップして冗長な括弧を削除するだけで、数バイト節約できます->n{n.to_s(2)[1..-1].to_i 2}
。– Ventero

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

4

C(gcc)、38バイト

組み込みのgccが使用されます。

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

に置き換える31-~2バイト節約されます。

@ThePirateBayシフトがマスクされるかどうかはハードウェアに依存します。自分のコンピュータ上で、それは出力0意志
コレラ蘇

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ずつ上がります。Ahコードゴルフ。
マイケルドーガン


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

オンラインでお試しください!

説明:入力バイナリー(¢)を取得し、最初の文字(Å)を切り取り、バイナリーとして解析して数値(n2)に戻します。



3

APL(Dyalog Unicode)、9バイト

⊢-2*∘⌊2⍟⊢

オンラインでお試しください!

Adamのおかげで-1バイト


完全に正しいですが、TIOを使用してテンプレートを生成していました。とにかく、⊢-2*∘⌊2⍟⊢バイトを保存します。
アダム

私は、APLが表されていなかったのが悲しかったです。APLが恋しい。
cmm

@cmm APLは健在です。Stack Exchange APLチャットルームで自由に時間を過ごしてください。
アダム


3

網膜15 13バイト

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

オンラインでお試しください!

単項の入出力(テストスイートには便宜上、10進数から10進数への変換が含まれています)。

説明

これは単項式で非常に簡単です。必要なのは、入力から最大の2のべき乗を削除することだけです。2のべき乗といくつかの前方参照を一致させることができます。実際には2 n -1の形式の値を照合する方が簡単なので、それを行い、1を個別に照合します。

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

グループは、最初に11つと一致して1物事を開始するか、最後の反復で2回一致します。それが一致するように1、そして2、その後、4というように。これらは加算されるため、常に2のべき乗の不足分になります。これは1最後に修正します。

後続の改行のため、一致は入力から単に削除されます。



3

PARI / GP、18バイト

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

代替ソリューション:

n->n-2^exponent(n)

最初のものは間違った答えを与えるようです。あるべきn->n-2^logint(n,2)?2番目のバージョンは、私のバージョンのPARI / GPでも、tio.runで使用されるバージョンでもサポートされていません。それは新しい機能ですか?
ジェッペスティグニールセン

@JeppeStigNielsen Oops、修正済み-それは私の電話から送信するためのものです。はい、2番目は新しい関数です。
チャールズ

exponent昨日追加されたこのチャレンジと比較して、私がチェックしたばかりの@JeppeStigNielsen が5日前に追加されました。:)
チャールズ



3

Excel、36 31バイト

-5 @ IanM_Matrix1のおかげでバイト

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

面白くも何とも。


REPLACEをMIDに置き換えてサイズを31バイトに減らします:= BIN2DEC(MID(DEC2BIN(A1)、2,99))
IanM_Matrix1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.