Bạn sẽ được cung cấp dưới dạng đầu vào một số nguyên k
trong phạm vi từ -4503599627370496
(−2 52 ) đến 4503599627370496
(2 52 ). Như đã biết , các số nguyên trong phạm vi này có thể được biểu diễn chính xác dưới dạng các giá trị dấu phẩy động có độ chính xác kép.
Bạn nên đầu ra các trọng lượng Hamming (số người) của mã hóa k
trong định dạng binary64 . Điều này sử dụng 1 bit cho dấu hiệu, 11 bit cho số mũ (được mã hóa với phần bù) và 52 bit cho lớp phủ; xem liên kết trên để biết chi tiết.
Như một ví dụ , số 22
được biểu diễn dưới dạng
0 10000000011 0110000000000000000000000000000000000000000000000000
Vì có 5
những cái, đầu ra là 5
.
Lưu ý rằng độ bền không ảnh hưởng đến kết quả, vì vậy bạn có thể sử dụng một cách an toàn biểu diễn bên trong của các giá trị độ chính xác kép để tính toán đầu ra.
Quy tắc bổ sung
- Chương trình hoặc chức năng được cho phép.
- Bất kỳ ngôn ngữ lập trình có thể được sử dụng.
- Sơ hở tiêu chuẩn bị cấm
- Số đầu vào sẽ ở dạng thập phân. Ngoài ra, định dạng đầu vào / đầu ra và định dạng linh hoạt như bình thường.
- Mã ngắn nhất trong byte thắng.
Các trường hợp thử nghiệm
22 -> 5
714 -> 6
0 -> 0
1 -> 10
4503599627370496 -> 5
4503599627370495 -> 55
1024 -> 3
-1024 -> 4
-4096 -> 5
1000000000 -> 16
-12345678 -> 16
binary64
số nguyên base2. Nếu bạn cần xử lý chúng một cách riêng biệt, thì có thể đáng làm một việc gì đó ngoài kiểu chơi chữ và lặp trên tất cả các bit.
long
, vì vậy bạn không thể nói bất kỳ binary64 nào double
, bởi vì không phải tất cả các nhân đôi đều là số nguyên. Nhưng tất cả các giá trị số nguyên double
có thể được chuyển đổi thành long
và trở lại, cho đến giới hạn của long
. (Như bạn chỉ ra, điều ngược lại là không đúng. Bạn nhận được double
chế độ làm tròn mặc định gần nhất , giả sử chế độ làm tròn mặc định). Dù sao, đây là một cách hoàn toàn hợp lệ để thiết lập câu hỏi; Tôi chỉ không đọc nó một cách cẩn thận>. <
binary64
định dạng dấu phẩy động nếu chúng muốn không? Một số người (bao gồm cả bản thân tôi, ban đầu) đã diễn giải câu hỏi khi yêu cầu các hàm chấp nhận đầu vào dưới dạng một số nguyên như C'slong
. Trong C, bạn có thể lập luận rằng ngôn ngữ sẽ chuyển đổi cho bạn, giống như khi bạn gọisqrt((int)foo)
. Nhưng có một số câu trả lời mã asm mã máy x86 (như codegolf.stackexchange.com/a/136360/30206 và của tôi), cả hai đều cho rằng chúng tôi phải chấp nhận đầu vào số nguyên 64 bit. Chấp nhận mộtbinary64
giá trị sẽ tiết kiệm 5 byte.