Thông báo

Collapse
No announcement yet.

Help...Tách số 16bit thành 2byte(cao và thấp) dùng C

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Help...Tách số 16bit thành 2byte(cao và thấp) dùng C

    Bác nào biết cách cắt một số 16bit thành 2 số 8bit chứa byte cao và byte thấp của số 16bit bẳng ngôn nhữ C chỉ em fát . Em xin đa tạ very much
    Mấy ai định nghĩa được tình yêu.
    Có gì đâu một buổi chiều.
    Kề dao lên cổ yêu hay chết .
    Gật đầu cái rụp thế là yêu.

    --------
    Apple

  • #2
    union INT_TO_BYTE
    {
    unsigned int i;
    unsigned char b[2];
    };
    union INT_TO_BYTE test;
    test.i=<số 16bit mà bạn muốn>;
    muốn lấy số 8 bit thì cứ test.b[0] hay .b[1]

    Sông dài, Thuyền lớn, Biển rộng bao la.
    Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

    Comment


    • #3
      ví dụ có khai báo thế này
      unsigned int k;
      unsigned char i,j,n,m;

      j=k&0xff;//lấy byte thấp
      i=(k>>8)&0xff;//lấy byte cao

      hoặc là
      n=8;
      while(n--){k<<=1;m=c;i=(i<<1)|m;}//byte cao
      n=8;
      while(n--){k<<=1;m=c;j=(j<<1)|m;}//byte thấp

      (C:cờ nhớ)

      còn có rất nhiều cách nữa,bạn tự tìm hiểu nhé, mình chỉ bất chợt nghĩ đến cách này thôi
      Last edited by saoxathu; 22-08-2008, 00:58.
      dientuvietnam.net

      Comment


      • #4
        Nguyên văn bởi quoc_thaibk Xem bài viết
        union INT_TO_BYTE
        {
        unsigned int i;
        unsigned char b[2];
        };
        union INT_TO_BYTE test;
        test.i=<số 16bit mà bạn muốn>;
        muốn lấy số 8 bit thì cứ test.b[0] hay .b[1]
        Cách này hay đấy
        dientuvietnam.net

        Comment


        • #5
          Chương trình:

          #include <AT89x52.h>
          #include <stdio.h>

          char s8bitlow; // so 8 bit LOW
          char s8bithi; //so 8 bit HIGH
          int s16bit; //so 16 bit

          void main(void){
          puts("CHIA SO 16 BIT RA 2 SO 8 BIT");

          s16bit=0xABCD;
          s8bitlow=s16bit;
          s8bithi=s16bit>>8;

          printf("So 16 bit: %X >> Byte cao %BX byte thap: %BX", s16bit,s8bithi,s8bitlow);

          while(1);
          }

          KQ:
          Running ... !
          CHIA SO 16 BIT RA 2 SO 8 BIT
          So 16 bit: ABCD >> Byte cao AB byte thap: CD

          Comment


          • #6
            Kết quả:Click image for larger version

Name:	Ketqua.PNG
Views:	1
Size:	44.1 KB
ID:	1333397

            Comment


            • #7
              như của quocthaibk là tuyệt chiêu rồi.

              Comment


              • #8
                Nguyên văn bởi hungnp Xem bài viết
                như của quocthaibk là tuyệt chiêu rồi.
                Cách của digicom cũng hay! đơn giản và dễ hiểu!

                Comment


                • #9
                  Cách của bạn digicom là đúng rồi. Thích thì có cách khác, so sánh xem cái nào tốn ít lệnh hơn thì dùng.
                  So_16_bit / 256 = Byte_cao
                  So_16_bit % 256 = Byte_thap (Phep chia lay phan du)
                  Ethernet-RS232, PIC Webserver, RFID Reader
                  CallerID, Cảnh báo BTS, ...
                  0988006696
                  linhnc308@gmail.com
                  http://linhnc308.blogspot.com

                  Comment


                  • #10
                    Mình đã dùng timer(Ngại đọc asm) để kiểm tra xem giữa khai báo kiểu union để lấy byte cao và byte thấp kể cả lấy giá trị của một bit bất kỳ trong một byte so với cách lấy bằng phép chia, phép phần dư, phép dịch bít,AND,OR,... như thông thường vẫn dùng thì thấy dùng khai báo union chương trình chạy nhanh hơn hẳn. Mà nhìn chương trình cũng chuyên nghiệp hơn?

                    Comment


                    • #11
                      Nguyên văn bởi hungnp Xem bài viết
                      Mình đã dùng timer(Ngại đọc asm) để kiểm tra xem giữa khai báo kiểu union để lấy byte cao và byte thấp kể cả lấy giá trị của một bit bất kỳ trong một byte so với cách lấy bằng phép chia, phép phần dư, phép dịch bít,AND,OR,... như thông thường vẫn dùng thì thấy dùng khai báo union chương trình chạy nhanh hơn hẳn. Mà nhìn chương trình cũng chuyên nghiệp hơn?
                      Đoạn chương trình của bác quocthaibk là tuyệt vời nhất. Dùng cách này áp dụng được cho nhiều trường hợp mà code sinh ra là tối ưu. Các bác nên dùng.
                      Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                      Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                      Comment


                      • #12
                        PHP Code:
                        unsigned int test 0xABCD;
                        unsigned char idata *abyte_caobyte_thap;
                        = &test;
                        byte_cao = *a;
                        byte_thap = *(a+1); 
                        Cách này thì sao nhỉ

                        Thực chất trong C, người ta thường dùng cách như saoxathu dùng
                        PHP Code:
                        j=k&0xff;//lấy byte thấp
                        i=(k>>8)&0xff;//lấy byte cao 
                        Diễn đàn Vi điều khiển:

                        Comment


                        • #13
                          hê hê, các bác góp ý thật là rôm rả. Em xin vote cho code (cách) của quocthai huynh. Rất ngắn mà dễ quản lý, chỉ cần khai báo một lần xài hoài, dùng cách dịch bit (<<,>>) cũng được nhưng hình như có vẻ không mang tính hệ thống bằng dùng kiểu union. E cũng mò mò tìm ra cách tương tự dùng union kết hợp struct có điều dài hơn của anh quocthai chút (hơn 1 lệnh thôi) (rút kinh nghiệm sau vậy..). Cảm ơn các huynh đã góp ý, chúc các huynh thành đạt VÀ EM LẠI CÓ THÊM MỘT CÂU HỎI MỚI NỮA NÈ:

                          -trong 2 cách khai báo sau có gì khác nhau không:
                          +cách 1:
                          ************
                          typedef union split16to8
                          {
                          unsigned short i;
                          unsigned char lo;
                          unsigned char hi;
                          };
                          ************

                          +cách 2:
                          ************
                          typedef union
                          {
                          unsigned short i;
                          unsigned char lo;
                          unsigned char hi;
                          }split16to8;
                          ************

                          +++nếu có giải thích giùm đệ chỗ khác đó
                          +++Nếu không thì tại sao khi đệ thêm câu lệnh này tiếp theo thì cách một báo lỗi còn cách 2 thì ko:

                          split16to8 number16bit;

                          ----------HẾT------------------
                          TB:các bác giải thích thêm giùm em chỗ này cái, em ko thấy có kiểu khai báo này trong giáo trình C: union INT_TO_BYTE test;
                          Last edited by apple; 23-08-2008, 01:53.
                          Mấy ai định nghĩa được tình yêu.
                          Có gì đâu một buổi chiều.
                          Kề dao lên cổ yêu hay chết .
                          Gật đầu cái rụp thế là yêu.

                          --------
                          Apple

                          Comment


                          • #14
                            Nguyên văn bởi apple Xem bài viết

                            TB:các bác giải thích thêm giùm em chỗ này cái, em ko thấy có kiểu khai báo này trong giáo trình C: union INT_TO_BYTE test;
                            kiểu khai báo này tại lúc viết đang dùm trình biên dịch C30 của dsPIC nên nó yêu cầu kiểu xài đó.C chuẩn thì cứ lấy "INT_TO_BYTE test" là được
                            Còn mấy cái typedef thì nó chuyển qua lại thấy lằng nhằng quá hok muốn nhớ.
                            Cậu cứ mở quyển lập trình C của Quách Tuấn Ngọc là có ngay sự phân biệt rõ ràng đỡ mấy cái lằng nhằng hok đáng mất time đấy.

                            Sông dài, Thuyền lớn, Biển rộng bao la.
                            Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

                            Comment


                            • #15
                              Nguyên văn bởi linhnc308 Xem bài viết
                              Cách của bạn digicom là đúng rồi. Thích thì có cách khác, so sánh xem cái nào tốn ít lệnh hơn thì dùng.
                              So_16_bit / 256 = Byte_cao
                              So_16_bit % 256 = Byte_thap (Phep chia lay phan du)
                              việc lấy phần dư với lại chia mà con số là 256 thì theo em là hok nên đâu anh Linh vì lúc nó dịch em mô phỏng bằng stopwatch thì tốn cũng cỡ cả trăm chu kì (kiểu chia 256-->số chia là kiểu long 32bit còn 16bit thì thoải mái vô tư)
                              So sánh với dịch bit thì dịch 8 lần chỉ tốn 3 chu kì máy (dsPIC hen còn cái khác thì tùy)

                              Sông dài, Thuyền lớn, Biển rộng bao la.
                              Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

                              Comment

                              Về tác giả

                              Collapse

                              apple Tìm hiểu thêm về apple

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X