이진수의 C # 첫 번째 1 (오른쪽에서 왼쪽)


10

C #을 사용하여 숫자의 이진 표현에서 첫 번째 1 (오른쪽에서 왼쪽)의 색인을 찾으려고합니다. 예를 들어, 이진수 100은 다음과 같습니다.

0b1100100

첫 번째 1은 오른쪽에서 세 번째 위치에 있으므로 3을 산출해야합니다.

234는 2를, 0은 0을 산출해야합니다.

내 현재 해결책은 다음과 같습니다.

k < 1 ? 0 :(int)Math.Log(k & -k, 2) + 1;

더 짧게 만들 수있는 방법이 있습니까?


1
명백한 팁은 불필요한 공백을 제거하는 것입니다. 쉽게 제거 할 수있는 10 개의 공백이 있습니다.
James

Convert.ToString(k,2).IndexOf("1")당신이 원하는 것, 또는 비슷한, 잘못된 사이트입니다.
Magic Octopus Urn

14
@ close-voters-마감 투표를해야하는 이유? 나는 이것이 주제에 관한 질문 이라고 생각합니다 . 아니면 이와 관련하여 내가 놓친 규칙 변경 사항이 있습니까?
Digital Trauma

답변:


3

C # 만 머신 별 내장 함수를 지원하는 경우… x86 어셈블리 언어 및 대부분의 다른 프로세서 아키텍처에서도이를 수행 할 수있는 단일 명령이 있습니다. 그렇다면 가장 짧은 코드뿐만 아니라 가장 빠른 코드를 가질 것입니다.

실제로이 코드를 더 짧게 만드는 것은이 코드를 빠르게 만드는 것과 비교할 때 지루한 문제 입니다. 매우 깔끔하고 효율적인 비트 트위들 링 솔루션에는 모든 종류가 있으며, 룩업 테이블 사용을 고려할 수도 있습니다.

그래도 골프에는 문제가되지 않습니다. 현재 솔루션이 최선을 다하는 것처럼 보입니다. 물론 불필요한 공백을 제거 할 수 있습니다.

k<1?0:(int)Math.Log(k&-k,2)+1

개인적으로 다음과 같이 씁니다.

k>0?(int)Math.Log(k&-k,2)+1:0

조건부 테스트의 방향을 0과 비교하는 것이 더 명확하다고 생각하기 때문에 6 가지 방법, 6 가지 방법, 6 가지 방법이라고 생각합니다.

C #은 암시 적 변환을 지원하지 않습니다 intbool당신이 정말로 조건 시험을 더 단축 할 수 있도록, C 및 C ++처럼.

C # 에서이 암시 적으로 발생하지 않기 때문에 double(my 반환 Math.Log) 에서으로 명시 적 캐스트에 붙어 int있습니다. 물론, 일반적으로 좋은 일입니다 그것이 당신이이 점을 지적 때문에 홍보 : 여기에 성능 문제 intA와를 double, a의 로그를 계산 double한 다음 변환 double에 결과 다시이 int될 것입니다 대규모 정상적으로 뭔가 그래서, 느린 피하고 싶었습니다. 그러나 이것들은 코드 골프를 할 때 따라야 할 종류의 변태입니다.


나는 처음에 생각해 냈다

k > 0
      ? ((k & -k) >> 1) + 1
      : 0

(물론 명료 함을 위해), 대수를 사용하지 않으므로 코드 크기와 속도가 향상됩니다. 불행히도, 이것이 항상 정답을 얻는 것은 아니며, 이것이 융통성이없는 요구 사항이라고 가정합니다. :-) 특히 입력 값 ( k)이 8의 계수 인 경우 실패합니다. 이는 수정 가능하지만 코드를 Math.Log버전 보다 길게 만들지 않으면 해결할 수 없습니다 .


코드 골프의 경우 Math정규화되어야하므로 바이트를 실제로 계산하지는 않았지만 다른 버전이 더 좋을 것입니다.
TheLethalCoder

당신은 잘못된 출력을 생성하는 것을 의미합니까? @the
코디 그레이

글쎄, 당신은 그것에 대한 수정이 있다고 말했지만 더 길어질 것입니다. 수정 사항이 OP 버전에 포함 된 System.경우보다 짧으면 짧고 정확해야합니다.
TheLethalCoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.