2010-02-09 58 views
5

Làm cách nào tôi có thể chuyển đổi giá trị kép thành giá trị nhị phân.chuyển đổi giá trị kép thành giá trị nhị phân

tôi có một số giá trị như thế này dưới đây 125252525235558554452221545332224587265 tôi muốn chuyển đổi này để format..so nhị phân tôi đang giữ nó trong đôi và sau đó cố gắng để chuyển đổi sang nhị phân (1 & 0 của) .. tôi đang sử dụng C# .net

+0

Bạn cần cụ thể hơn một chút trong câu hỏi của mình. Các chi tiết như ngôn ngữ lập trình, CPU, OS, v.v ... và một chút nữa về những gì bạn đang thực sự cố gắng đạt được sẽ mang lại nhiều câu trả lời tốt hơn. http://catb.org/~esr/faqs/smart-questions.html –

Trả lời

0

Nếu bạn muốn tự mình làm điều đó, thì đây không phải là câu hỏi lập trình.

Nếu bạn muốn làm cho một máy tính làm điều đó, cách dễ nhất là sử dụng một thói quen đầu vào dấu chấm động và sau đó hiển thị kết quả dưới dạng hex của nó. Trong C++:

double f = atof ("5.5555555555556E18"); 
unsigned char *b = (unsigned char *) &f; 
for (int j = 0; j < 8; ++j) 
    printf (" %02x", b [j]); 
+0

Bạn có thể muốn đề cập rằng số 8 dành cho loại dữ liệu rất cụ thể. Tôi không nghĩ rằng IEEE754 64-bit là bắt buộc theo tiêu chuẩn C. – paxdiablo

11

Vâng, bạn đã không được xác định một nền tảng hay những gì sắp xếp của giá trị nhị phân bạn quan tâm, nhưng trong .NET có BitConverter.DoubleToInt64Bits cho phép bạn nhận được ở IEEE 754 bit chiếm giá trị rất dễ dàng.

Trong Java, có Double.doubleToLongBits cũng giống như vậy.

Lưu ý rằng nếu bạn có giá trị như "125252525235558554452221545332224587265" thì bạn có nhiều thông tin hơn số đôi có thể lưu trữ chính xác ngay từ đầu.

0

Giá trị kép đã là giá trị nhị phân. Nó chỉ là vấn đề đại diện mà bạn muốn nó có. Trong một ngôn ngữ lập trình khi bạn gọi nó là một đôi, sau đó ngôn ngữ mà bạn sử dụng sẽ giải thích nó theo một cách. Nếu bạn xảy ra để gọi cùng một đoạn bộ nhớ một int, sau đó nó không phải là cùng một số.

Vì vậy, nó phụ thuộc vào những gì bạn thực sự muốn ... Nếu bạn cần phải ghi nó vào đĩa hoặc mạng, sau đó bạn cần phải suy nghĩ về BigEndian/LittleEndian.

+0

tôi có một số giá trị như thế này dưới đây 125252525235558554452221545332224587265 tôi muốn chuyển đổi sang định dạng nhị phân..vì vậy tôi đang giữ nó ở chế độ kép và sau đó cố chuyển đổi thành nhị phân (1 & 0's) .. tôi đang sử dụng C# .net – raj

+0

BTW, con số đó dài 127 bit nên chỉ có thể được xấp xỉ (kém) với gấp đôi. –

6

Trong C, bạn có thể làm điều đó ví dụ theo cách này, đó là việc sử dụng cổ điển của union xây dựng:

int i; 
union { 
double x; 
unsigned char byte[sizeof (double)]; 
} converter; 

converter.x = 5.5555555555556e18; 

for(i = 0; i < sizeof converter.byte; i++) 
    printf("%02x", converter.byte[i]); 

Nếu bạn dính này trong main() và chạy nó, nó có thể in một cái gì đó như thế này :

~/src> gcc -o floatbits floatbits.c 
~/src> ./floatbits 
ba b5 f6 15 53 46 d3 43 

Lưu ý rằng điều này, tất nhiên, phụ thuộc vào nền tảng trong số endianness. Ở trên là từ một hệ thống Linux chạy trên một Sempron CPU, nghĩa là nó là một chút endian.

-1

Đối với những số khổng lồ này (những người không thể trình bày chính xác bằng cách sử dụng đôi), bạn cần sử dụng một số lớp chuyên biệt để giữ thông tin cần thiết.

C# cung cấp các lớp Decimal:

Các kiểu giá trị thập phân đại diện cho số thập phân khác nhau, từ tích cực 79.228.162.514.264.337.593.543.950.335 để tiêu cực 79.228.162.514.264.337.593.543.950.335. Loại giá trị thập phân phù hợp cho các tính toán tài chính đòi hỏi số lượng lớn các chữ số nguyên và số nguyên phân tách đáng kể và không có lỗi vòng tròn. Loại thập phân không loại bỏ nhu cầu làm tròn. Thay vào đó, nó giảm thiểu lỗi do làm tròn. Ví dụ: mã sau đây tạo ra kết quả là 0,9999999999999999999999999999 thay vì 1.

Nếu bạn cần độ chính xác lớn hơn, bạn cần tự tạo lớp của riêng mình.Có một ở đây cho ints: http://sourceforge.net/projects/cpp-bigint/ mặc dù nó có vẻ là cho c + +.

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