2010-03-05 49 views
5

Nếu tôi có số nhị phân 32 bit và tôi muốn thay thế số 16 bit thấp hơn của số nhị phân bằng số 16 bit mà tôi có và giữ 16 bit trên của số đó thành tạo ra một số nhị phân mới .. làm thế nào tôi có thể làm điều này bằng cách sử dụng toán tử bitwise đơn giản?Thuật toán cho bitwise fiddling

Ví dụ số nhị phân 32-bit là:

1010 0000 1011 1111 0100 1000 1010 1001 

và thấp hơn 16-bit tôi có là:

    0000 0000 0000 0001 

nên kết quả là:

1010 0000 1011 1111 0000 0000 0000 0001 

tôi có thể làm cái này như thế nào?

+0

Tôi muốn làm điều này trong một bước – aherlambang

+0

Bạn không thể thực hiện việc này với 1 toán tử. Bạn cần ít nhất 2, và với phần mở rộng dấu tham gia, 3. – polygenelubricants

Trả lời

8

Bạn làm điều này theo hai bước:

  • Mask ra các bit mà bạn muốn thay thế (AND nó với 0s)
  • Fill trong thay thế (OR nó với các bit mới)

Vì vậy, trong trường hợp của bạn,

i32 number; 
i32 mask_lower_16 = FFFF0000; 
i16 newValue; 

number = (number AND mask_lower_16) OR newValue; 

thực hiện ngôn ngữ lập trình thực tế, bạn cũng có thể cần để giải quyết vấn đề tiện ích mở rộng ký hiệu trên giá trị 16 bit. Trong Java, ví dụ, bạn có để che dấu 16 bit trên của short như thế này:

short v = (short) 0xF00D; 
    int number = 0x12345678; 
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF); 
    System.out.println(Integer.toHexString(number)); // "1234f00d" 
+3

+1. độc đáo giải thích. –

+1

Nếu OP là một newbie, xin lưu ý sự khác biệt giữa logic AND (&&) và bitwise AND (&) –

+0

Xong. Cũng giải quyết vấn đề mở rộng dấu hiệu. – polygenelubricants

3
(original32BitNumber & 0xFFFF0000) | 16bitNumber 
+1

hoạt động thứ hai phải là HOẶC – vpram86

+0

Cảm ơn! Tôi phải đã làm điều này hàng triệu lần và vẫn quản lý để gõ sai điều! –

+0

+1 Đây là nó !! –

1

Vâng, tôi có thể cho bạn biết câu trả lời. Nhưng có lẽ đây là bài tập về nhà. Vì vậy, tôi sẽ không.

Hãy xem xét rằng bạn có một vài lựa chọn:

| // bitwise OR 
^ // bitwise XOR 
& // bitwise AND 

lẽ vẽ lên một bảng nhỏ và quyết định cái nào sẽ cung cấp cho bạn kết quả bên phải (khi bạn hoạt động trên phần bên phải của số nhị phân lớn hơn của bạn).

1

sử dụng & để che dấu các bit thấp và sau đó | để hợp nhất giá trị 16 bit với giá trị 32 bit

uint a = 0xa0bf68a9 
short b = 1 

uint result = (a & 0xFFFF0000) | b;