2013-06-01 30 views
5

Ở đây tôi muốn tạo mẫu bit để đặt n chữ số bằng 1 bắt đầu từ vị trí p. Chữ số được đánh số từ 0 to 31. Sau đây là những gì tôi đã làm.Tạo mẫu bit cụ thể bằng cách sử dụng toán tử bitwise

int bitPattern(int n, int p) { 
    int hex, num1, num2; 
    hex = 0x80000000; 
    num1 = (hex >> (31 - p)); 
    num2 = (hex >> (31 - (n+p))); 
    return num1^num2; 
} 

Ví dụ:

bitPattern(6, 2) should return 
..000011111100 

Bất kỳ giải pháp thay thế với những hoạt động ít hơn?

+2

Bạn đang gọi hành vi không xác định khi 'n + p> 31'. Nếu điều đó được đảm bảo không bao giờ xảy ra, bạn vẫn có hành vi được thực hiện xác định dịch chuyển số âm. Nhưng nếu bạn không sợ UB, những gì về '((1 << n) - 1) << p'? –

+0

@DanielFischer trong vấn đề của tôi '(n + p)' sẽ không vượt quá 31. và nó rất dễ dàng để xác định ... – noufal

+1

Dù sao, nếu bạn chỉ quan tâm đến các bit, tôi khuyên bạn nên sử dụng một loại unsigned, và sau đó '((1 << n) - 1) << p' là an toàn trừ khi' n' hoặc 'p' là âm hoặc lớn hơn hoặc bằng chiều rộng của loại. –

Trả lời

5

Bạn có thể làm điều đó như thế này:

return ((1<<n)-1)<<p; 

Để làm n người ở vị trí zero, tính (2^n)-1; nhớ lại rằng 2^n1<<n, vì vậy biểu thức trở thành ((1<<n)-1). Bây giờ bạn cần thêm p số 0 ở mặt sau, vì vậy, hãy dịch kết quả sang trái bằng p.

+0

@danielFischer đã đưa ra câu trả lời tương tự ... Cảm ơn bạn đã giải thích ... – noufal

Các vấn đề liên quan