플로트 754-해밍 제공됩니다 . 잘 알려진 바와 같이

(-2 52 ) ~ (2 52 ) 범위 의 정수 가 입력 으로 제공됩니다 . 잘 알려진 바와 같이 ,이 범위의 정수는 배정 밀도 부동 소수점 값으로 정확하게 표현 될 수 있습니다.k-45035996273704964503599627370496

당신은해야 출력 해밍 무게 의 인코딩 (사람 수) kbinary64 형식 . 부호는 1 비트, 지수는 11 비트 (오프셋으로 인코딩), 가수는 52를 사용합니다. 자세한 내용은 위의 링크를 참조하십시오.

예를 들어 숫자 22

0 10000000011 0110000000000000000000000000000000000000000000000000

하나가 있으므로 5출력은 5입니다.

엔디안은 결과에 영향을 미치지 않으므로 기계의 실제 배정도 값의 내부 표현을 안전하게 사용하여 출력을 계산할 수 있습니다.

추가 규칙

테스트 사례

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발신자에게 반환 할 수 있도록 남겨 둡니다 .

POPCNTIntel 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의 답변을 기반으로하지만 자신의 답변을 개선하고 싶지 않기 때문에 여기에 더 골프 버전을 게시하고 있습니다.

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