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 #은 암시 적 변환을 지원하지 않습니다 int
에 bool
당신이 정말로 조건 시험을 더 단축 할 수 있도록, C 및 C ++처럼.
C # 에서이 암시 적으로 발생하지 않기 때문에 double
(my 반환 Math.Log
) 에서으로 명시 적 캐스트에 붙어 int
있습니다. 물론, 일반적으로 좋은 일입니다 그것이 당신이이 점을 지적 때문에 큰 홍보 : 여기에 성능 문제 int
A와를 double
, a의 로그를 계산 double
한 다음 변환 double
에 결과 다시이 int
될 것입니다 대규모 정상적으로 뭔가 그래서, 느린 피하고 싶었습니다. 그러나 이것들은 코드 골프를 할 때 따라야 할 종류의 변태입니다.
나는 처음에 생각해 냈다
k > 0
? ((k & -k) >> 1) + 1
: 0
(물론 명료 함을 위해), 대수를 사용하지 않으므로 코드 크기와 속도가 향상됩니다. 불행히도, 이것이 항상 정답을 얻는 것은 아니며, 이것이 융통성이없는 요구 사항이라고 가정합니다. :-) 특히 입력 값 ( k
)이 8의 계수 인 경우 실패합니다. 이는 수정 가능하지만 코드를 Math.Log
버전 보다 길게 만들지 않으면 해결할 수 없습니다 .