HÌnh như code trên là của mèo con.
Bạn muốn tách thành từng phần thì bạn phải biết mỗi phần là từ bit nào tới bit nào chứ. Lên mạng search chuẩn IEEE 754 đi. Rất dễ, bạn nên tự làm tiếp đi.
Mình có "tìm" được một đoạn code (sori,hổng nhớ của ai nữa).Đoạn code này cho phép xem các bit của 1 biến Float
C++ Code:
#include <stdio.h> #include <conio.h> void Parse(unsigned char ch,char *result) { int num = (int)ch; for (int i=7;i>=0;i--) { result[i] = '0' + (num & 1); num >> 1; } } void DumpFloat(float x,char *result) { unsigned char *pch = (unsigned char *)&x; int n = 0; for (int i=sizeof(float)-1;i>=0;i--) { Parse(pch[i],&result[n]); n += 8; } result[n] = 0; } int main(int argc, char* argv[]) { float x = 12.3; char result[33]; DumpFloat(x,result); printf("%s\n",result); getch(); return 0; }
Vấn đề là mình muốn sữa lại đoạn code trên,sau cho thành 1 hàm thôi,hàm dumpFloat(float *p) để khi khai báo 1 số float x,truyền vào hàm dumpFloat(&x) thì ta sẽ được biểu diễn dạng bit của x.
Rồi trong biểu diễn đó,do mình mới tiếp cận phần này nên mong mọi người chỉ dùm là phần exponent,significand là phần nào,liệu mình có thể cho chương trình chỉ ra 2 phần đó luôn được không nhỉ?
Thanks mọi người nhiều !
HÌnh như code trên là của mèo con.
Bạn muốn tách thành từng phần thì bạn phải biết mỗi phần là từ bit nào tới bit nào chứ. Lên mạng search chuẩn IEEE 754 đi. Rất dễ, bạn nên tự làm tiếp đi.
C++ Code:
#include <stdio.h> void DumpFloat( float x, char* result) { unsigned char* pch = ( unsigned char * )&x; int n = 0; for( int i = sizeof( float ) - 1; i >= 0; --i ) { int num = ( int )pch[ i ]; char* tores = &result[ n ]; for( int o = 7; o >= 0; --o ) { *( tores + o ) = '0' + ( num & 1 ); num >> 1; } n += 8; } result[ n ] = 0; } int main() { float x = 12.3; char result[ 33 ]; DumpFloat( x,result ); printf( "%s\n",result ); return 0; }
Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.
uhm,thanks code của mèo con.Tại mình thấy nó gọn hơn 1 chút thoy.Mọi người ơi,còn cái này nữa,mình muốn viết 1 hàm ghi các bit vào vùng nhớ Float,hàm WriteBit(float * p,char* s).Ví dụ như vầy,khai báo biến float x
khi gọi hàm WriteBit(&x,"11100") thì 5bit cao nhất của vùng nhớ 32bit chiếm bởi x sẽ được ghi giá trị lần lượt là 1,1,1,0,0 còn các bit khác gán bit 0.
Mọi người cho ý kiến nha thanks!
Vấn đề là cậu chưa hiểu code của cat ! Nếu cậu hiểu thì cậu có thể dễ dàng viết lại 1 version khác. Cậu hỏi các khác trong khi cậu không hiểu cái đã có thì làm sao mà được ?
Uhm,thanks ý kiến của Mod rox_rook.Nhưng mình nghĩ,chỉ là mình chưa hiểu rõ các thao tác trên bit như zầy.Có lẽ có 2 ví dụ sẽ hỉu hơn,nên rất mong mọi ng zúp đỡ bài 2 !Thanka
Làm vầy nè bạn, mình đang buồn ngủ + code vội quá nên cũng chưa test kỹ.
C Code:
void WriteBit(float *p,const char *s) { int n = 0; long *plng = (long *)p; while (s[n++] != 0); for (int i=n-2;i>=0;i--) (*plng) = ((*plng) >> 1) + ((s[i] - '0') << (sizeof(float) - 1)); }
Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.
Thanks mèo con ! Để mình coi lại và hy vọng là sẽ hiểu.
Mọi người cho mình hỏi câu nhỏ này thôi,số float nhỏ nhất mà lớn hơn 0 là số nào ?Và trong C++,có phép toán nào cho ra kết quả là số NaN (not a number) ko? thanks!