2015-08-26 32 views
9

Cho số nguyên, 98749287 nói, có một số hàm tích hợp/libray, hoặc Erlang hoặc Elixir, để nhận được kích thước theo byte không?Lấy kích thước tính theo byte của một số nguyên tùy ý

Để làm rõ, số byte tối thiểu được sử dụng để biểu thị số ở dạng nhị phân. Có vẻ đơn giản, và đã viết một hàm bằng cách sử dụng phương pháp "phân chia theo cơ sở" và sau đó đếm bit, nhưng sau một vài giờ tìm kiếm tài liệu havent tìm thấy bất cứ điều gì cho những gì có vẻ hữu ích để có.

+1

OOC , bạn đang cố làm gì vậy? – zxq9

+1

Tôi phải mã hóa một số số nguyên bằng cách sử dụng Quy tắc mã hóa cơ bản (đóng gói các phần số nguyên tùy ý thành chuỗi 7 bit). – Englishbob

+3

Có một mô-đun ASN.1 cho Erlang hoạt động khá tốt. Tùy thuộc vào nhu cầu tổng thể của bạn, điều này có thể là một lựa chọn tốt hơn (tôi sử dụng nó thường xuyên!). – zxq9

Trả lời

11

Nếu bạn có một số nguyên unsigned, bạn có thể sử dụng đoạn mã sau:

byte_size(binary:encode_unsigned(Integer)) 

Ví dụ:

1> byte_size(binary:encode_unsigned(3)). 
1 
2> byte_size(binary:encode_unsigned(256)). 
2 
3> byte_size(binary:encode_unsigned(98749287)). 
4 
+0

Chỉ là những gì tôi đang tìm kiếm. Vấn đề với việc học Elixir là dễ dàng để quên đi tài liệu Erlang (hay đúng hơn là "tránh"). Có thể ném một vài chức năng ngay bây giờ. – Englishbob

+1

Vâng, có thể phức tạp. Điều này chỉ giúp nếu bạn đang sử dụng OS X, nhưng tôi thường sử dụng Dash và tìm kiếm tài liệu Erlang và Elixir cùng một lúc cho các nội dung như "số nguyên", "nhị phân" và "kích thước" và như vậy. Đó là một cách tuyệt vời để tìm các chức năng có liên quan. –

1

Hãy thử biểu thức này:

Value = (... your input ...), 
NumBytes = size(integer_to_binary(Value, 2) + 7) div 8. 

tham khảo: http://www.erlang.org/doc/man/erlang.html#integer_to_binary-2

+0

Điều này dường như hoạt động. mặc dù để lại một số thập phân lộn xộn phải được làm tròn. Suy nghĩ về +7 là gì? – Englishbob

+0

+7 là cố gắng làm tròn lên. Vui lòng thay đổi sự phân chia thành một bộ phận sàn hoặc số nguyên, như toán tử C/'. – Nayuki

+1

Đặt 'div 8' thay vì '/ 8' để chia số nguyên. – legoscia

Các vấn đề liên quan