Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Chương trình về dạng bit của số Float !

  1. #1
    Ngày gia nhập
    10 2008
    Bài viết
    2

    Smile Chương trình về dạng bit của số Float !

    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:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void Parse(unsigned char ch,char *result)
    5. {
    6.     int num = (int)ch;
    7.    
    8.     for (int i=7;i>=0;i--)
    9.     {
    10.         result[i] = '0' + (num & 1);
    11.         num >> 1;
    12.     }
    13. }
    14.  
    15. void DumpFloat(float x,char *result)
    16. {
    17.     unsigned char *pch = (unsigned char *)&x;
    18.     int n = 0;
    19.  
    20.     for (int i=sizeof(float)-1;i>=0;i--)
    21.     {
    22.         Parse(pch[i],&result[n]);
    23.         n += 8;
    24.     }
    25.  
    26.     result[n] = 0;
    27. }
    28.  
    29. int main(int argc, char* argv[])
    30. {
    31.     float x = 12.3;
    32.     char result[33];
    33.  
    34.     DumpFloat(x,result);
    35.     printf("%s\n",result);
    36.  
    37.     getch();
    38.     return 0;
    39. }

    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 !

  2. #2
    Ngày gia nhập
    07 2007
    Nơi ở
    TP.HCM
    Bài viết
    199

    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.

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    C++ Code:
    1. #include <stdio.h>
    2.  
    3. void DumpFloat( float x, char* result) {
    4.     unsigned char* pch = ( unsigned char * )&x;
    5.     int n = 0;
    6.  
    7.     for( int i = sizeof( float ) - 1; i >= 0; --i ) {
    8.         int   num   = ( int )pch[ i ];
    9.         char* tores = &result[ n ];
    10.         for( int o = 7; o >= 0; --o ) {
    11.             *( tores + o ) = '0' + ( num & 1 );
    12.             num >> 1;
    13.         }
    14.         n += 8;
    15.     }
    16.  
    17.     result[ n ] = 0;
    18. }
    19.  
    20. int main() {
    21.     float x = 12.3;
    22.     char result[ 33 ];
    23.  
    24.     DumpFloat( x,result );
    25.     printf( "%s\n",result );
    26.  
    27.     return 0;
    28. }

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi MATH-INFO Xem bài viết
    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.
    Code này của mình chứ của ai. Mình đã tách hàm ra cho dễ rồi chủ topic lại muốn nhập vô.
    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.

  5. #5
    Ngày gia nhập
    10 2008
    Bài viết
    2

    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!

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Chương trình về dạng bit của số Float !

    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 ?

  7. #7
    Ngày gia nhập
    10 2008
    Bài viết
    2

    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

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    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:
    1. void WriteBit(float *p,const char *s)
    2. {
    3.     int n = 0;
    4.     long *plng = (long *)p;
    5.    
    6.     while (s[n++] != 0);
    7.  
    8.     for (int i=n-2;i>=0;i--)
    9.         (*plng) = ((*plng) >> 1) + ((s[i] - '0') << (sizeof(float) - 1));      
    10. }
    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.

  9. #9
    Ngày gia nhập
    10 2008
    Bài viết
    2

    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!

  10. #10
    Ngày gia nhập
    10 2008
    Bài viết
    10

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    C++ Code:
    1. #include <stdio.h>
    2.  
    3. void DumpFloat( float x, char* result) {
    4.     unsigned char* pch = ( unsigned char * )&x;
    5.     int n = 0;
    6.  
    7.     for( int i = sizeof( float ) - 1; i >= 0; --i ) {
    8.         int   num   = ( int )pch[ i ];
    9.         char* tores = &result[ n ];
    10.         for( int o = 7; o >= 0; --o ) {
    11.             *( tores + o ) = '0' + ( num & 1 );
    12.             num >> 1;
    13.         }
    14.         n += 8;
    15.     }
    16.  
    17.     result[ n ] = 0;
    18. }
    19.  
    20. int main() {
    21.     float x = 12.3;
    22.     char result[ 33 ];
    23.  
    24.     DumpFloat( x,result );
    25.     printf( "%s\n",result );
    26.  
    27.     return 0;
    28. }
    Bạn ơi,bài này mình chạy kết quả ra không chính xác.

Các đề tài tương tự

  1. Code stack bằng danh sách liên kết viết bằng C. Sửa lỗi "cannot convert 'float' to 'float'... "
    Gửi bởi giangcoi92 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 11
    Bài viết cuối: 28-11-2011, 10:29 PM
  2. giải thích giùm mình lỗi cannot convert from 'float' to 'float*'
    Gửi bởi hoanghiep9x trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 06-05-2011, 08:20 PM
  3. float và double trong C++: warning C4244: conversion from 'double' to 'float'
    Gửi bởi dungtimtoinua2008 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 18-03-2010, 11:25 PM
  4. cannot convert float(*)[] to float* for argument '1' to void
    Gửi bởi vanphamvn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 10-12-2008, 05:12 PM
  5. Tạo một số float ngẫu nhiên | Tạo Random số float
    Gửi bởi md_vn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 20
    Bài viết cuối: 06-06-2008, 11:00 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn