Tôi có một chức năng gọi là replaceByte(x,n,c)
đó là để thay thế byte n
trong x
với c
với các hạn chế sau:thay thế byte trong 32 bit số
- Bytes đánh số từ 0 (LSB) đến 3 (MSB)
- Ví dụ:
replaceByte(0x12345678,1,0xab) = 0x1234ab78
- Bạn có thể giả định 0 < = n < = 3 và 0 < = c < = 255
- ops pháp lý :
! ~ &^| + << >>
Max ops: 10
int replaceByte(int x, int n, int c) { int shift = (c << (8 * n)); int mask = 0xff << shift; return (mask & x) | shift; }
nhưng khi tôi thử nghiệm nó tôi nhận được lỗi này:
LỖI: Kiểm tra replaceByte (-2147483648 [0x80000000], 0 [0x0], 0 [0x0]) không thành công ... ... Cung cấp 0 [0x0]. Nên -2147483648 [0x80000000]
sau khi nhận ra rằng * không phải là một nhà điều hành pháp cuối cùng tôi đã tìm nó ra ... và nếu bạn tò mò, đây là những gì tôi đã làm:
int replaceByte(int x, int n, int c) {
int mask = 0xff << (n << 3);
int shift = (c << (n << 3));
return (~mask & x) | shift;
}
hmmm ngay cả với điều đó, tôi nhận được cùng một lỗi – asdfghjkl
@shaynie Xem chỉnh sửa của tôi –
Bạn có thể giải thích cách -> "int mask = 0xff << shift;" hoạt động cho bạn không. tôi như OP cập nhật nên có lẽ là "int mask = 0xff << (n << 3);" –