2009-08-21 45 views
5

Tôi phải thừa nhận trong tất cả công việc của mình với Java, tôi chưa bao giờ gặp sự cần thiết của một liên minh Java (như công đoàn C, chứ không phải câu lệnh SQL) và tôi không thể tìm thấy câu trả lời ở đây trên SO. Phải thừa nhận rằng, hầu hết công việc của tôi trong Java đã được trừu tượng hóa cao hơn bit-fiddling.Làm thế nào tôi có thể nhận/thiết lập các bit riêng lẻ trong một phao?

Tôi có số nguyên mà tôi đang thiết lập các bit riêng lẻ và tôi muốn in ra phao chính xác đơn IEEE754 tương đương.

Trong C, tôi muốn làm một cái gì đó như:

union { 
    int i; 
    float f; 
} x; 
x.i = 0x27; 
printf ("%f\n", x.f); 

Làm thế nào để làm một điều tương tự trong Java? Thậm chí có thể xử lý cùng một bộ nhớ như hai loại dữ liệu khác nhau trong Java không?

Tôi đã tìm kiếm trên cả SO và các nơi khác cho "java union" nhưng nó đã làm tôi thất vọng với công cụ SQL - tôi không thể tìm ra cách để làm điều này.

Trả lời

12

Tôi có một số nguyên mà tôi đang thiết bit riêng lẻ cho và tôi muốn in ra tương đương IEEE754 phao đơn chính xác.

Sử dụng intBitsToFloat() cho điều đó.

+0

Bang. Đó là những gì tôi đã sau. Và tôi thấy ngược lại là Float.floatToRawIntBits. Bây giờ tôi chỉ cần các biến thể Double/Long nhưng tôi giả định, nếu có một, nó sẽ ở trong lớp Double. Tôi sẽ đi tìm điều đó. Cảm ơn đống. – paxdiablo

+2

Tôi vẫn còn bối rối ... điều này có liên quan gì đến công đoàn? – skaffman

+0

Và +1. – paxdiablo

9

Substitutes for Missing C Constructs

Các nhà thiết kế của lập trình Java ngôn ngữ đã chọn để bỏ qua xây dựng công đoàn vì có một cơ chế nhiều tốt hơn cho việc xác định một loại dữ liệu duy nhất có khả năng đại diện cho đối tượng có kiểu khác nhau: subtyping. A công đoàn bị phân biệt đối xử thực sự chỉ là một giả lập đơn giản của một phân cấp lớp.

Bao gồm các ví dụ.

+0

Có, nhưng phân cấp lớp không tốt ở đây. Tôi muốn có thể thiết lập nó như một loại và đọc nó như một loại khác. Một hệ thống phân cấp lớp sẽ buộc tôi phải đặt nó và đọc nó như cùng loại. – paxdiablo

+0

+1 cho liên kết rất đẹp – dfa

+0

Hãy sao lưu - có cách nào để thay đổi một bit trong phao không? Đó là những gì tôi đang tìm kiếm.Tôi muốn để có thể thiết lập (ví dụ) bit 31, 27, 4, và 0 của phao để xem giá trị đó là gì. – paxdiablo

5

Java không cung cấp bất kỳ cách nào để coi giá trị dưới dạng giá trị khác trên cấp bit thô - không có công đoàn, chẳng hạn như reinterpret_cast. Tuy nhiên, đối với trường hợp cụ thể của bạn trong việc xử lý floatint và ngược lại, bạn có thể sử dụng phương thức java.lang.Float.floatToIntBitsintBitsToFloat.

+0

+1 để biết thông tin, ngay cả khi @MB chỉ đánh bại bạn. Cảm ơn. – paxdiablo

4

Nếu bạn quan tâm trong việc tiếp cận các đại diện chút cấp của một float, java.lang.Double chứa phương pháp để làm điều này (doubleToLongBits vv)

Union'ing giữa các loại con trỏ (hoặc giữa con trỏ và họ represetantion số) sẽ mở lỗ hổng trong hệ thống loại, do đó, nó là hoàn toàn không thể.

+1

+1. và điều này kết thúc nhiệm vụ của tôi (tôi sẽ cần điều này cho đôi/dài sau này). Ta. – paxdiablo

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