정수에서 최상위 비트 지우기


29

입력

입력은 단일 양의 정수입니다 n

산출

출력의 n최상위 비트가로 설정되어 0있습니다.

테스트 사례

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

예를 들어 : 350바이너리는 101011110입니다. 최상위 비트 (즉, 가장 왼쪽 1비트) 를 설정하여 10 진수 정수인 출력 으로 0바꿉니다 . 이다 OEIS A053645 .00101111094


19
가장 중요한 비트를 10분명하게 제거하면 0: D
clabacchio

@clabacchio I .. it ... 어 ... 뭐? (좋은 것)
Baldrickk

12
0은 0과 마찬가지로 중요합니다. "가장 중요한 비트"라고 말하면 "1로 설정된 최상위 비트"를 의미합니다.
Michael Kay

답변:


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 바이트. 이것은 내 골프가 아니며 다른 사람이 귀하의 게시물을 편집하려고했지만 골프 게시물에 대한 수정 사항이 커뮤니티 규칙에 따라 허용되지 않기 때문에 롤백했습니다.
HyperNeutrino

1
@HyperNeutrino 지금 바로 편집 내용을보고 승인했습니다. 그 규칙을 알지 못했지만 멋진 골프 팁입니다!
cleblanc

아 알았어 예, 일반적으로 사람들은 골프 팁에 대한 의견을 게시해야하며 OP는 수정을해야합니다. 그러나 동의하면 문제가되지 않습니다. :)
HyperNeutrino


9

05AB1E , 5 바이트

.²óo-

온라인으로 사용해보십시오!

정수 중 가장 중요한 비트를 제거 N하면 까지의 거리에 해당 찾는 N을 가장 높은 정 전력으로 2 이하 N .

따라서 나는 공식 N-2 층 (log 2 N)을 사용했습니다 :

  • -밑이 2 인 로그 .
  • ó -정수에서 바닥.
  • o- 2 위의 결과의 제곱.
  • - -차이.

1
b¦C또한 작동합니다 ... 그렇지 않습니까? 이진으로 변환, MSB는 항상 인덱스 1에 있습니다. MSB를 제거하고 다시 변환하십시오.
매직 문어 Urn

2
@MagicOctopusUrn 아니, 잘못되었습니다 1!
Mr. 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
이것에 대해 묻고 대답 해 주셔서 감사합니다.
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
매크로를 작성하여 2 바이트를 더 절약 할 수도 있습니다.
Steadybox

7

MATL , 8 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-(TIO / Octave가 아닌 MATLAB에서만 작동)
Sanchises

6

자바 (OpenJDK 8) , 23 바이트

n->n^n.highestOneBit(n)

온라인으로 사용해보십시오!

죄송합니다. 내장 :-/


.NET 및 Python과 같은 다른 인기있는 언어는 그렇지 않은 내장 Java! o.Ô +1. 빌드하지 않고 더 긴 내용을 게시하려고했습니다. 15 바이트가 더 짧습니다. XD
Kevin Cruijssen의

@KevinCruijssen 같은 n->n^1<<(int)Math.log2(n)것이 작동하며 38 바이트보다 짧을 수 있습니다. 그것이 highestOneBit제대로 작동하지 않으면 그것은 두 번째 (아직 테스트되지 않은) 아이디어 였습니다. 호기심, 솔루션 무엇 이었습니까
올리비에 그레 구 아르

광산이었다 n->n^1<<(int)(Math.log(n)/Math.log(2))때문에 Math.log2자바에 존재하지 않습니다. ; P 만 Math.log, Math.log10Math.loglp사용할 수 있습니다.
케빈 크루이 ssen

2
나는 xor 대신 마이너스 만 똑같이 게시하려고했습니다. 의 방법 기억
JollyJoker

1
@KevinCruijssen 죄송합니다, Math.log2실제로 존재하지 않습니다 ... 내 나쁜. 만나다? 좋은 방법 ( highestOneBit)이 하나 있지만 다른 방법 ( )은 없습니다 Math.log2. Java는 이상하다 ;-)
Olivier Grégoire

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

그렇지, 실제로 3 5 바이트처럼 마찬가지로 젤리 솔루션이 보인다
Bartek Banachewicz

1
마찬가지로 젤리에 @BartekBanachewicz는 껍질이 그래서, 자신의 코드 페이지를 사용하는 것입니다 P : 실제로 3 바이트
HyperNeutrino

@BartekBanachewicz 코드 페이지는 여기를 참조하십시오 : github.com/barbuz/Husk/wiki/Codepage
Laikoni


5

파이썬 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 heh 미안하지만 당신을 이길 : P
HyperNeutrino

2**len(bin(n))/8철자가 가능 1<<len(bin(n))-3하면 2와 3 모두에서 작동합니다 (바이트가 저장되거나 추가되지 않음).
Mego

@Mego Cool, 추가 주셔서 감사합니다!
HyperNeutrino

5

파이썬 3 , 30 바이트

caird coinheringaahing 덕분에 -8 바이트 메모리에서 입력했습니다. :영형

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

온라인으로 사용해보십시오!



글쎄, a) 1에 오류가있을 것입니다 .b) 나는 그것을 생각할 수 없을 정도로 바보입니다. 그러나 나는 약간의 변화로 그것을 고쳤다. 감사!
완전히 인간적인

작동하도록 코드를 편집했으며 4 바이트를 절약했습니다.
caird coinheringaahing

여전히 1에 오류가 있습니다.
완전히 인간적인

@cairdcoinheringaahing 그것은 내 원래의 대답 이었으나 1에서 오류가 발생했음을 깨달았습니다. 해결 방법은 간단한 XOR 방법보다 길었습니다
FlipTack



4

J, 6 바이트

}.&.#:

꽤 간단합니다.

설명

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

나는 이것을 게시하려고했다 :(
Cyoce

@Cyoce Me too ...
Adám


4

루비, 26 바이트

Ventero 덕분에 -7 바이트. Historicrat 덕분에 -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을 출력합니다.
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.
Ruslan

어쩌면 여러 버전에서 구문을 혼합하는 것 같습니다 (ret은 aarch64에서 온 것입니다). 어셈블러가이를 대신 할 것이라고 생각했습니다. 그러나 여기서는 이전 및 직접 lsl / lsr을 사용하는 것이 정확할 것입니다.
Michael Dorgan

재밌는 일, 나는 1 적은 작업으로 그것을 할 수 있지만 바이트 크기는 2 증가합니다. 아 코드 골프.
Michael Dorgan

3

Pyth, 5 바이트

a^2sl

테스트 스위트.

설명:

    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 바이트

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

APL (Dyalog Unicode) , 9 바이트

⊢-2*∘⌊2⍟⊢

온라인으로 사용해보십시오!

Adam 덕분에 -1 바이트


TIO 를 사용하여 템플릿을 생성 했지만 완전히 수정했습니다 . 어쨌든 ⊢-2*∘⌊2⍟⊢바이트를 저장합니다.
Adám

나는 APL이 표현되지 않아서 슬 was 고 스크롤에서 거의 잃어 버렸습니다! APL이 그립습니다.
cmm

@ cmm APL은 살아 있고 잘 있습니다. Stack Exchange APL 대화방 에서 자유롭게 놀 수 있습니다 .
Adám

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

온라인으로 사용해보십시오!

단항으로 입력 및 출력 합니다 (테스트 스위트에는 편의를 위해 10 진수로의 변환이 포함됨).

설명

단항 모드에서는 매우 쉽습니다. 우리가하고 싶은 일은 입력에서 가장 큰 2의 거듭 제곱을 삭제하는 것입니다. 우리는 2의 거듭 제곱을 일부 전방 참조와 일치시킬 수 있습니다. 실제로 2 n -1 형식의 값을 일치시키는 것이 더 쉽기 때문에이를 수행하고 1을 개별적으로 일치 시킵니다 .

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

그룹 은 처음에 1하나를 일치시켜 1일을 시작하거나 마지막 반복에서했던 것의 두 배와 일치합니다. 그것은 일치 그래서 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)? 두 번째 버전은 내 PARI / GP 버전이나 tio.run에서 사용하는 버전에서 지원되지 않습니다 . 새로운 기능입니까?
Jeppe Stig Nielsen

@JeppeStigNielsen Oops, 고정-전화로 제출하면 얻을 수 있습니다. 예, 두 번째는 새로운 기능입니다.
찰스

방금 확인한 @JeppeStigNielsen exponent은 어제 추가 된이 도전과 비교하여 5 일 전에 추가되었습니다. :)
찰스



3

엑셀, 36 31 바이트

-5 @ IanM_Matrix1 덕분에 바이트

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

흥미로운 것은 없습니다.


())을 2,99 MID (DEC2BIN (A1) = BIN2DEC : 중간에 것으로 교체하여 31 바이트의 크기를 줄
IanM_Matrix1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.