2011-07-29 40 views
6

Tôi không tốt với các toán tử bitwise vì vậy xin vui lòng giải thích câu hỏi nhưng làm thế nào tôi sẽ xóa 16 bit thấp hơn của một số nguyên 32-bit trong C/C++?Rõ ràng thấp hơn 16 bit

Ví dụ tôi có một số nguyên: 0x12345678 và tôi muốn thực hiện điều đó: 0x12340000

Trả lời

13

Để xóa bất kỳ tập hợp các bit, bạn có thể sử dụng toán tử AND với sự bổ sung của một số có 1s trong những nơi đó. Trong trường hợp của bạn, vì số lượng 0xFFFF có thấp hơn 16 bit của nó được thiết lập, bạn có thể và với sự bổ sung của nó:

b &= ~0xFFFF; // Clear lower 16 bits. 

Nếu bạn muốn thiết những bit, bạn thay vì có thể sử dụng một Bitwise OR với một con số đó đã những bit thiết lập:

b |= 0xFFFF; // Set lower 16 bits. 

Và, nếu bạn muốn lật những bit, bạn có thể sử dụng một XOR Bitwise với một con số đó có những bit thiết lập:

b ^= 0xFFFF; // Flip lower 16 bits. 

Hy vọng điều này sẽ hữu ích!

+0

Điều này thực sự tốt vì nó hoạt động với các giá trị 16 và 64 bit, nếu tôi không nhầm. –

+0

@Ray - tại sao phải không? – James

+0

@ James- Nếu bạn cố gắng làm một cái gì đó như 'b & 0xFFFF0000' trên một máy không 32 bit (ví dụ, một máy 64-bit), sau đó điều này có thể vô tình kết thúc thanh toán bù trừ 32 bit cao, thêm vào thấp 32 bit. – templatetypedef

2

Một cách sẽ là bitwise AND với 0xFFFF0000 ví dụ: value = value & 0xFFFF0000

1

Sử dụng một (&) với một mặt nạ được làm từ top 16 bit tất cả những người (mà sẽ để lại các bit đầu như họ đang có) và các bit dưới tất cả các số không (mà sẽ giết các bit đáy của số).

Vì vậy, nó sẽ được

0x12345678 & 0xffff0000 

Nếu kích thước của các loại không được biết đến và bạn muốn để mặt nạ ra chỉ có 16 bit thấp hơn bạn cũng có thể xây dựng các mặt nạ theo cách khác: sử dụng một mặt nạ mà sẽ cho phép vượt qua chỉ thấp hơn 16 bit

0xffff 

và nghịch nó với Bitwise không (~), vì vậy nó sẽ trở thành một mặt nạ mà giết chỉ thấp hơn 16 bit:

012.351.
0x12345678 & ~0xffff 
1
int x = 0x12345678; 
int mask = 0xffff0000; 

x &= mask; 
4

Chịu con đường khác, bạn có thể thử

x = ((x >> 16) << 16); 
1

Giả sử các giá trị mà bạn muốn xóa bit từ có một loại unsigned không thuộc về "cấp bậc nhỏ", đây là, hầu hết các con đường xách tay an toàn nhất để xóa thấp hơn 16 bit:

b &= -0x10000; 

giá trị -0x10000 sẽ được thúc đẩy để loại b (một loại unsigned) bởi số học modula, kết quả là tất cả bit cao được thiết lập và 16 bit thấp bằng không.

Chỉnh sửa: Thực ra câu trả lời của James là an toàn nhất (trường hợp sử dụng rộng nhất), nhưng cách câu trả lời và tổng quát hóa các vấn đề tương tự khác có chút khác biệt và tôi có thể áp dụng nhiều hơn trong các vấn đề liên quan.

+0

Tại sao không làm một cái gì đó như 'b & = ~ (1? 0xFFFF: b);'? –