2010-12-14 19 views
13

Giả sử tôi có một byte như thế này 1010XXXX trong đó các giá trị X có thể là bất kỳ thứ gì. Tôi muốn thiết lập bốn bit thấp hơn cho một mẫu cụ thể, nói 1100, trong khi để lại bốn bit trên không bị ảnh hưởng. Làm thế nào tôi sẽ làm điều này nhanh nhất trong C?Làm thế nào để bạn chỉ thiết lập một số bit của một byte trong C mà không ảnh hưởng đến phần còn lại?

Trả lời

11

Bạn có thể đặt tất cả các bit đó thành 0 bằng bitwise-anding với 4 bit được đặt thành 0 và tất cả các thiết lập khác thành 1 (Đây là phần bù của 4 bit được đặt thành 1). Bạn có thể sau đó bitwise hoặc trong các bit như bình thường.

tức

val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0 
val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no 
          // other bits are set. 
33

Nói chung:

value = (value & ~mask) | (newvalue & mask); 

mask là một giá trị với tất cả các bit được thay đổi (và chỉ cho họ) để thiết lập 1 - nó sẽ được 0xF trong trường hợp của bạn. newvalue là một giá trị chứa trạng thái mới của các bit đó - tất cả các bit khác về cơ bản đều bị bỏ qua.

Điều này sẽ hoạt động với tất cả các loại mà nhà khai thác bitwise được hỗ trợ.

+0

Bạn có thể đưa ra một ví dụ cụ thể không? Giả sử tôi có: n = 1024. Tôi muốn thay đổi bit từ vị trí 3 đến 7 (bao gồm, bắt đầu từ 0 với bit ít quan trọng nhất) thành k = 19. Kết quả phải là: 1176. Làm thế nào tôi có thể đạt được nó? Cảm ơn bạn. – dh16

0

Sử dụng toán tử bitwise hoặc | khi bạn muốn thay đổi các bit của một byte từ 0 đến 1.

điều hành Sử dụng Bitwise và & khi bạn muốn thay đổi các bit của một byte 1-0

Ví dụ

#include <stdio.h> 

int byte; 
int chb; 

int main() { 
// Change bit 2 of byte from 0 to 1 
byte = 0b10101010;  
chb = 0b00000100;  //0 to 1 changer byte 
printf("%d\n",byte); // display current status of byte 

byte = byte | chb;  // perform 0 to 1 single bit changing operation 
printf("%d\n",byte); 

// Change bit 2 of byte back from 1 to 0 
chb = 0b11111011;  //1 to 0 changer byte 

byte = byte & chb;  // perform 1 to 0 single bit changing operation 
printf("%d\n",byte); 
} 

Có lẽ có những cách tốt hơn, tôi không biết. Điều này sẽ giúp bạn ngay bây giờ.

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