2012-04-12 38 views
6

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; 
} 

Trả lời

4

Ahh ... Bạn gần như ở đó.

Chỉ cần thay đổi

return (mask & x) | shift; 

để

return (~mask & x) | shift; 

Các mask nên chứa tất cả những người ngoại trừ khu vực để được đeo mặt nạ và không phải ngược lại.

Tôi đang sử dụng mã đơn giản này và nó hoạt động tốt trong gcc

#include<stdio.h> 

int replaceByte(int x, int n, int c) 
{ 
    int shift = (c << (8 * n)); 
    int mask = 0xff << shift; 
    return (~mask & x) | shift; 
} 

int main() 
{ 

    printf("%X",replaceByte(0x80000000,0,0)); 

    return 0; 
} 
+2

hmmm ngay cả với điều đó, tôi nhận được cùng một lỗi – asdfghjkl

+0

@shaynie Xem chỉnh sửa của tôi –

+0

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);" –

6

Vì đây trông giống như bài tập về nhà tôi sẽ không để gửi mã, nhưng liệt kê các bước bạn cần phải thực hiện:

  1. Cast c thành một số 32-bit, do đó bạn không bị mất bất kỳ bit trong khi chuyển
  2. Tiếp theo, shift c bởi số bit thích hợp ở bên trái (nếu n==0 không dịch chuyển, nếu n==1 dịch chuyển bằng 8, v.v.)
  3. Tạo bit bit 32 bit sẽ không thấp nhất 8 bit của x, sau đó thay đổi mặt nạ này với cùng số tiền như bước cuối cùng
  4. Thực hiện phép toán AND giữa bitmask chuyển và x để không ra các bit thích hợp x
  5. Thực hiện bitwise OR (hoặc bổ sung) của chuyển c giá trị và x để thay thế các bit đeo mặt nạ của cái sau
+0

ok Tôi hiểu tất cả điều đó trừ những phần mà bạn nói "Tạo một bitmask 32-bit sẽ zero 8 bit thấp nhất x ..." – asdfghjkl

+0

@shaynie Trước khi bạn đi về việc thay thế các bit của' x' bạn cần phải không 8 bit đó sẽ được thay thế. Đó là nơi mà bitmask đến. – Praetorian

+0

ok có ý nghĩa, tôi đặt một số mã ở trên mà tôi đã gửi và lỗi mà tôi nhận được – asdfghjkl

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