(-2 52 ) ~ (2 52 ) 범위 의 정수 가 입력 으로 제공됩니다 . 잘 알려진 바와 같이 ,이 범위의 정수는 배정 밀도 부동 소수점 값으로 정확하게 표현 될 수 있습니다.k
-4503599627370496
4503599627370496
당신은해야 출력 해밍 무게 의 인코딩 (사람 수) k
에 binary64 형식 . 부호는 1 비트, 지수는 11 비트 (오프셋으로 인코딩), 가수는 52를 사용합니다. 자세한 내용은 위의 링크를 참조하십시오.
예를 들어 숫자 22
는
0 10000000011 0110000000000000000000000000000000000000000000000000
하나가 있으므로 5
출력은 5
입니다.
엔디안은 결과에 영향을 미치지 않으므로 기계의 실제 배정도 값의 내부 표현을 안전하게 사용하여 출력을 계산할 수 있습니다.
추가 규칙
- 프로그램이나 기능 이 허용됩니다.
- 모든 프로그래밍 언어를 사용할 수 있습니다.
- 표준 허점 은 금지되어 있습니다
- 입력 번호는 10 진수입니다. 그 외에는 입출력 수단과 형식이 평소처럼 유연 합니다.
- 바이트 단위의 최단 코드가 이깁니다.
테스트 사례
22 -> 5
714 -> 6
0 -> 0
1 -> 10
4503599627370496 -> 5
4503599627370495 -> 55
1024 -> 3
-1024 -> 4
-4096 -> 5
1000000000 -> 16
-12345678 -> 16
답변
MATL , 5 바이트
3Z%Bz
MATLAB 답변의 정확한 음역. 입력과 출력은 암시 적입니다. Luis Mendo 덕분에 -2 바이트
3Z% % Typecast: changes input (implicitly taken and converted to double) to uint64 without changing underlying bits
B % Convert integer to array of 1s and 0s
z % Count nonzero entries
답변
x86_64 기계 언어 (Linux), 16 바이트
0: f2 48 0f 2a c7 cvtsi2sd %rdi, %xmm0
5: 66 48 0f 7e c0 movq %xmm0, %rax
a: f3 48 0f b8 c0 popcnt %rax, %rax
f: c3 retq
의 단일 64 비트 정수 매개 변수를 허용하고 RDI
에서의 부동 소수점 값으로 변환 한 다음 XMM0
해당 비트 를 에 저장 RAX
한 다음 해밍 가중치를 계산 RAX
하여 결과를 RAX
발신자에게 반환 할 수 있도록 남겨 둡니다 .
POPCNT
Intel Nehalem, AMD Barcelona 및 이후의 마이크로 아키텍처와 같은 명령어 를 지원하는 프로세서가 필요합니다 .
하려면 온라인으로보십시오! 다음 C 프로그램을 컴파일하고 실행하십시오.
#include<stdio.h>
const char g[]="\xF2\x48\x0F\x2A\xC7\x66\x48\x0F\x7E\xC0\xF3\x48\x0F\xB8\xC0\xC3";
#define f(x) ((int(*)(long))g)(x)
int main(int a){
printf("%d\n",f(22));
printf("%d\n",f(714));
printf("%d\n",f(0));
printf("%d\n",f(1));
printf("%d\n",f(4503599627370496L));
printf("%d\n",f(4503599627370495L));
printf("%d\n",f(1024));
printf("%d\n",f(-1024));
printf("%d\n",f(-4096));
printf("%d\n",f(1000000000));
printf("%d\n",f(-12345678));
}
답변
C (gcc) , 82 68 바이트
Neil 덕분에 9 바이트.
사악한 부동 소수점 비트 수준 해킹
s;f(long n){double d=n;n=*(long*)&d;for(s=0;n;n*=2)s+=n<0;return s;}
답변
파이썬 3 , 72 71 바이트
Lynn 덕분에 1 바이트.
lambda n:n and(bin(1020+len(bin(abs(n))))+bin(abs(n))).count('1')-(n>0)
설명
binary64 형식은 세 가지 구성 요소로 구성됩니다.
- 첫 번째 비트는 부호 비트이며
1
, 숫자가 음수 인 경우 - 다음 11 비트는 1023이 추가 된 지수를 저장합니다.
- 다음 52 비트는 유효 또는 가수를 저장합니다.
답변
C (gcc) , 47 바이트
f(double n){n=__builtin_popcountl(*(long*)&n);}
이것은 휴대용이 아닙니다. 컴파일러 플래그없이 Linux를 실행하는 x86_64에서 gcc 7.1.1로 테스트되었습니다.
답변
자바 (OpenJDK 8) , 92 바이트
int f(long n){int s=0;for(n=Double.doubleToLongBits((double)n);n!=0;n>>>=1)s+=n&1;return s;}
답변
C (gcc), 63 바이트
f(double d){long s=0,n=*(long*)&d;for(;n;n*=2)s+=n<0;return s;}
이 솔루션은 @LeakyNun의 답변을 기반으로하지만 자신의 답변을 개선하고 싶지 않기 때문에 여기에 더 골프 버전을 게시하고 있습니다.