Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: [BT]Đổi chỗ 4 bit đầu và 4 bit cuối

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

    Mặc định [BT]Đổi chỗ 4 bit đầu và 4 bit cuối

    Dương có người bạn phỏng vấn trong gameloft trong đó có câu hỏi.
    Chỉ dùng vòng lập While và 1 biến a-- đổi chổ 4 bit sau và 4 bit đầu của 1 byte bộ nhớ.
    Dương Ko rành về giải thuật nên làm hoài Ko xong. Các bạn ai biết làm ơn chỉ dùm.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    05 2007
    Nơi ở
    HCMC
    Bài viết
    60

    Bài của bạn khá thú vị ! sonhn có 2 cách giải như sau:
    - Cách 1: dùng vòng lặp while lặp lại 4 lần, mỗi lần thực hiện:
    + Kiểm tra xem bit thứ 8 của biến a có = 1 hay không
    + Nếu bằng 1 thì dịch biến a sang trái 1 bit, rồi OR với 1
    + Ngược lại, dịch biến a sang trái 1 bit, rồi OR với 0
    Code:
    while (lặp lại 4 lần)
    {
        if(a & 0x80)             //kiểm tra bit bên trái cùng (bit thứ 8) có bằng 1?
            a = a << 1 | 1;
        else
            a = a << 1 | 0;
    }
    - Cách 2: Sử dụng toán tử xoay bít của hợp ngữ --> xoay biến a sang trái 4 bit (thậm chí không cần dùng vòng lặp while!)
    Code:
    __asm rol a,4;    //xoay biến a sang trái 4 bit
    Ghi chú thêm: giá trị Hexa 0x80 --> đổi sang nhị phân = [1000 0000] (bít thứ 8 = 1, các bit còn lại = 0)
    Đã được chỉnh sửa lần cuối bởi sonhn : 01-08-2007 lúc 10:35 AM.

  3. #3
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Cả hay cách trên đều đổi 4 bit đầu về 4 bit cuối nhưng thứ tự bị đảo ngược lại.
    Nếu đề bài yêu cầu không được đảo thì em dùng cách sau:
    a= a << 4 + a >> 4;

    To phamduong: Em cũng xin nhắc luôn, đề bài anh đặt ra không rõ ràng. Em sẽ sửa lại cho phù hợp.

  4. #4
    Ngày gia nhập
    05 2007
    Nơi ở
    HCMC
    Bài viết
    60

    To hailoc12: không có sự khác nhau giữa cách của bạn và 2 cách của mình, càng không có chuyện "thứ tự bị đảo ngược lại" . Hơn nữa, hailoc12 sửa lại biểu thức như thế này mới đúng:
    Code:
    a= a << 4 | a >> 4;     //thay toán tử + thành | (OR)
    Có thể kiểm tra lại bằng đoạn code:

    Code:
    unsigned char a = 0x86;
    _asm rol a,4;
    printf("%x",a);   //in ra: 68

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Có bài này nhờ các bạn chỉ cho:

    Cho 2 số a,b;
    Không được khai thêm biến mới, hãy đổi chỗ giá trị của a và b.

  6. #6
    Ngày gia nhập
    06 2007
    Nơi ở
    Hà Nội
    Bài viết
    361

    Mặc định [BT]Đổi chỗ 4 bit đầu và 4 bit cuối

    a=a+b; //ban đầu cho a=5, b=3 đi sau khi gán a=8, b=3
    b=a-b; //b=8-3=5 , a=8
    a=a-b; //a=8-5=3 , b=5
    thế là đổi chỗ ngon lành
    Đã được chỉnh sửa lần cuối bởi tienlbhoc : 01-08-2007 lúc 02:35 PM.
    Blog tổng quan kiến thức về viễn thông : http://tongquanvienthong.blogspot.com/

    mSPDict từ điển android hỗ trợ liên kết tra trên các trình đọc sách điện tử và tra sách giấy thông qua camera
    http://www.tinhte.vn/threads/691731/

  7. #7
    Ngày gia nhập
    06 2007
    Bài viết
    40

    Mở rộng bài toán của Popo chút nhỉ:
    - Có 3 số a,b,c . Không dùng thêm biến phụ, làm thế nào để mỗi số bằng tổng của 2 số còn lại .

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Có 3 số a,b,c . Không dùng thêm biến phụ, làm thế nào để mỗi số bằng tổng của 2 số còn lại
    a = a+b+c;
    b = a-b;
    c = a-c;
    a = (a-b) + (a-c);
    Thế này đúng chưa nhẩy )
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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