Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Tìm vị trí xuât hiện đầu tiên của dãy bit

  1. #1
    Ngày gia nhập
    12 2010
    Bài viết
    9

    Wink Tìm vị trí xuât hiện đầu tiên của dãy bit

    Bác nào code giùm e bài này với

    Cho 1 số nguyên 4 byte. Hãy tìm vị trí xuât hiện đầu tiên của dãy bit “111”, trả về -1 nếu dãy “111” không tồn tại.
    Vd:
    Number = 0 x 9A6F9E5A (10011010011011111001111001011010b) → return 12
    Number = 0 x 12E (100101110b) → return 28

    chú ý có 4byte nên
    0 x 12E là
    0x00 00 01 2E thì nó phải là
    00000000 00000000 00000001 00101110 nên là 28
    Đã được chỉnh sửa lần cuối bởi langman : 31-12-2010 lúc 12:28 PM.

  2. #2
    Ngày gia nhập
    03 2010
    Nơi ở
    Nơi nào đó trong vũ trụ
    Bài viết
    550

    Có cách nào hay hơn cách chuyển số kia sang xâu nhị phân rồi dùng hàm strstr không nhỉ ?
    Gió thu lạnh lẽo hắt hiu lòng!

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    124

    number thứ 2 trả về 28 là sao? ko hiểu?

  4. #4
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi birthis Xem bài viết
    Có cách nào hay hơn cách chuyển số kia sang xâu nhị phân rồi dùng hàm strstr không nhỉ ?
    ko cần làm thế đâu em

    C Code:
    1. #include<conio.h>
    2. #include<stdio.h>
    3. int tim(int n)
    4. {
    5.     int i,flag=-1;
    6.     for(i=0;i<29;i++,n>>=1)
    7.         if ((n&7)==7) flag=29-i;
    8.     return flag;
    9. }
    10. void main()
    11. {
    12.     int n;
    13.     scanf("%x",&n);
    14.     printf("%d",tim(n));
    15.     getch();
    16. }

    Trích dẫn Nguyên bản được gửi bởi zero22hero Xem bài viết
    number thứ 2 trả về 28 là sao? ko hiểu?
    28 là đúng rồi bạn à
    0 x 12E là
    0x00 00 01 2E thì nó phải là
    00000000 00000000 00000001 00101110
    ở đề bài nói rõ là 4byte thì phải là 28 chứ sao mà là 5 được
    Đã được chỉnh sửa lần cuối bởi langman : 08-01-2013 lúc 09:41 AM.
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  5. #5
    Ngày gia nhập
    12 2010
    Bài viết
    9

    thanks pác langman lắm lắm,
    pác giải thích ý tưởng chỗ này được hem ah
    for(i=0;i<29;i++,n>>=1)
    if ((n&7)==7) flag=29-i;
    Đã được chỉnh sửa lần cuối bởi langman : 31-12-2010 lúc 04:15 PM. Lý do: xóa đề bài 2 đi

  6. #6
    Ngày gia nhập
    08 2009
    Bài viết
    23

    Mặc định Tìm vị trí xuât hiện đầu tiên của dãy bit

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    ko cần làm thế đâu em
    Bác Langman có thể giải thích rõ được ko, em đọc vào không hiểu ý tưởng của bác lắm

  7. #7
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    _ Một topic chỉ được hỏi xoay 1 vấn đề duy nhất ( được quyền hỏi nhiều câu nhưng phải xoay quanh 1 vấn đề), ko được post 1 topic mà hỏi từ 2 bài tập trở lên trong 1 topic, tất cả các bài viết post từ 2 bài trở nên trong 1 topic từ nay sẽ bị move thẳng tay vào thùng rác .
    2. đổi i<29 thành i<29&&n để giảm số lượng vòng lặp đi thành ít nhất

    3. muốn hiểu thì chạy thử code này nhập thử vào trường hợp "12e" sẽ hiểu
    C Code:
    1. #include<conio.h>
    2. #include<stdio.h>
    3. void _nhiphan(unsigned n)
    4. {
    5.     n>>1?_nhiphan(n>>1):0;
    6.     printf("%d",n&1);
    7. }
    8. void nhiphan(int n)
    9. {
    10.     unsigned *x=(unsigned *)(void*)&n;
    11.     _nhiphan(*x);
    12. }
    13. int tim(int n)
    14. {
    15.     printf("Ban dau :           n=");
    16.     nhiphan(n);
    17.     int i,flag=-1;
    18.     for(i=0;i<29&&n;i++,n>>=1)
    19.     {
    20.         printf("\nTai vong lap thu %2d n=",i+1);
    21.         nhiphan(n);
    22.         if ((n&7)==7) {flag=29-i;printf("------> co tan cung la ");nhiphan(7);}
    23.     }
    24.     return flag;
    25. }
    26. void main()
    27. {
    28.     int n;
    29.     scanf("%x",&n);
    30.     printf("\nTim thay tai vi tri%d",tim(n));
    31.     getch();
    32. }
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  8. #8
    Ngày gia nhập
    12 2010
    Bài viết
    9

    oh,thanks pac, để e thử

  9. #9
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    Trích dẫn Nguyên bản được gửi bởi pmluv Xem bài viết
    oh,thanks pac, để e thử
    quên mất nhập thử case "12e" chỉ để hiểu tại sao
    nhập case ban đầu của bạn thì bạn sẽ hiểu tại sao lại dùng biến flag
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

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

    Hi,

    Code của langman có thể hiểu như sau:
    Bất cứ số nào có tận cùng với "the last 3 least significant bit" mà "and" với 7 sẽ cho ra 7, vì đơn giản most significant bit của 7 từ trái qua tất cả đều bằng 0.
    Ví dụ:
    C++ Code:
    1. 0000010100111
    2. &
    3. 0000000000111
    4. ------------------
    5. 0000000000111
    Còn số 29 = 32 - 3
    Và 4 bytes = 32 bits
    Muốn coi sự chuyển đổi của bit, các gọn nhất là dùng class std::bitset<>, rất dễ sử dụng.
    Ví dụ:
    std::bitset<số bít> num;
    Chạy đoạn này:
    C++ Code:
    1. #include <vector>
    2. #include <algorithm>
    3. #include <functional>
    4. #include <iostream>
    5. #include <bitset>
    6.  
    7.  
    8. void trace_bit_pattern( int n ) {
    9.     std::bitset<32> num( n );
    10.     std::bitset<32> seven( 7 );
    11.     std::cout << "Original bit pattern: \n";
    12.     std::cout << num << '\n';
    13.     for( int i( 0 ); i < 29; ++i, num >>= 1 ) {
    14.         std::cout << "\n --- Shift one bit to the right, the new bit pattern is \n";
    15.         std::cout << num;
    16.         std::cout << "\n --- Perform & operation with 7\n";
    17.         std::cout << '\t' << num << '\n';
    18.         std::cout << '\t' << seven << '\n';
    19.         std::cout << '\t' << "--------------------------------\n";
    20.         std::cout << '\t' << ( num & seven ) << '\n';
    21.         std::cout << "\n Hit the enter key to continue...\n";
    22.         std::cin.get();
    23.     }
    24. }
    25.  
    26. int main() {
    27.     trace_bit_pattern( 20 );
    28. }

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

  1. Bán nhà HXH Đinh Tiên Hoàng 106 m2 chỉ 6 tỷ
    Gửi bởi hoangtambds trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 29-08-2013, 02:10 PM
  2. Lập trình C In k số nguyên tố đầu tiên có tổng các chữ số là chắn trong mảng, lỗi chỉ kiểm tra được với số đầu tiên?
    Gửi bởi ncn1992vn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 23-11-2012, 10:20 PM
  3. Thứ tự ưu tiên các toán tử và ...???
    Gửi bởi whonghaiw trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 24-06-2012, 10:58 PM
  4. Bài tập C M bit đầu tiên biểu diễn N
    Gửi bởi zuro93 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 01-12-2011, 10:16 AM
  5. Mảng trên C Không in ra vị trí đầu tiên.
    Gửi bởi tuanvu199x trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 28-09-2011, 09:45 PM

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