2010-03-25 43 views
5

Tôi đang cố gắng thực hiện đảo ngược bit trong một byte. Tôi sử dụng mã dưới đâyĐảo ngược bit sử dụng bitwise

static int BitReversal(int n) 
{ 
    int u0 = 0x55555555; // 01010101010101010101010101010101 
    int u1 = 0x33333333; // 00110011001100110011001100110011 
    int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111 
    int u3 = 0x00FF00FF; // 00000000111111110000000011111111 
    int u4 = 0x0000FFFF; 
    int x, y, z; 
    x = n; 
    y = (x >> 1) & u0; 
    z = (x & u0) << 1; 
    x = y | z; 

    y = (x >> 2) & u1; 
    z = (x & u1) << 2; 
    x = y | z; 

    y = (x >> 4) & u2; 
    z = (x & u2) << 4; 
    x = y | z; 

    y = (x >> 8) & u3; 
    z = (x & u3) << 8; 
    x = y | z; 

    y = (x >> 16) & u4; 
    z = (x & u4) << 16; 
    x = y | z; 

    return x; 
} 

Nó có thể Reverser bit (trên một máy 32-bit), nhưng có một vấn đề, Ví dụ, đầu vào là 10001111101, tôi muốn nhận được 10111110001, nhưng phương pháp này sẽ đảo ngược toàn bộ byte bao gồm tiêu đề 0s. Đầu ra là 10111110001000000000000000000000. Có phương pháp nào để đảo ngược số thực tế không? Tôi không muốn chuyển đổi nó thành chuỗi và đảo ngược, sau đó chuyển đổi một lần nữa. Có phương pháp toán học thuần túy hay phương pháp vận hành bit nào không?

Trân trọng,

+0

Mặc dù tôi hiểu phương pháp của bạn: nó không thể biên dịch vì bạn sử dụng u4 và chưa xác định nó trong ví dụ của bạn. –

+0

Thêm int u4 = 0x0000FFFF; – user287792

+0

Đây không phải là lý do, tôi chỉ bỏ lỡ điều đó. –

Trả lời

1

cách Cheesy là để thay đổi cho đến khi bạn có được một 1 bên phải:

if (x != 0) { 
    while ((x & 1) == 0) { 
     x >>= 1; 
    } 
} 

Lưu ý: Bạn nên chuyển tất cả các biến để unsigned int. Như được viết, bạn có thể có tiện ích mở rộng đăng nhập không mong muốn bất cứ khi nào bạn chuyển sang phải.

+0

Bạn nên kiểm tra xem giá trị được chèn có bằng không, bacause bạn có thể kết thúc bằng một vòng lặp vô hạn. –

+0

Và xem ra những gì bit dấu hiệu hiện trên một sự thay đổi quyền đã ký, nó được thực hiện xác định. Có lẽ điều đúng là cho mã của người hỏi để chuyển sang sử dụng int chưa được ký: không có lý do gì để nó được ký và nó không đáng để gặp rắc rối. –

4

Lấy số bit cao nhất bằng cách sử dụng phương pháp tương tự và chuyển các bit kết quả sang phải 33 - # bit và voila!

0

Một phương pháp có thể là tìm số bit dấu đầu tiên trong số n, dịch chuyển trái n theo số đó và sau đó chạy nó qua thuật toán trên của bạn.

+0

Điều này sai: 1000 (bit cao 3) trở thành << 3 và do đó 10000000 và ngược lại đây là 0x02000000 và không phải 1! –

+0

@Ritsaert: 1000 có 24 bit dấu đầu, vì vậy bạn thay đổi 24, không 3 –

0

Giả sử tất cả 32 bit là đáng kể và đảo ngược toàn bộ điều. Bạn có thể cố gắng làm cho nó đoán số lượng bit quan trọng bằng cách tìm số 1 cao nhất, nhưng điều đó không nhất thiết phải chính xác vì vậy tôi khuyên bạn nên sửa đổi hàm để có tham số thứ hai cho biết số bit quan trọng. Sau đó, sau khi đảo ngược các bit chỉ cần chuyển chúng sang phải.

0

Thử sử dụng Integer.reverse (int x);