Ở đâ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?
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'? –
@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
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. –