2011-12-19 26 views
13

Giả sử, tôi có một số nguyên như , tôi muốn bỏ đặt bit thứ ba để có được 10001; nếu tôi có 10001, tôi vẫn sẽ nhận được 10001; làm thế nào tôi có thể đạt được nó?Cách bỏ đặt một bit cụ thể trong một số nguyên

unset(int i, int j) 
int i= 10101 or 10000 
int j = 00100 
+9

Bạn có thể làm cho tâm trí của bạn về ngôn ngữ? –

+2

Vui lòng cho chúng tôi biết bạn đang sử dụng ngôn ngữ lập trình nào * thực sự *. ("Mã" trong câu hỏi của bạn không hợp lệ trong bất kỳ câu hỏi nào mà bạn đã gắn thẻ.) –

Trả lời

38

Giả sử rằng bạn đang lập chỉ mục bit từ cánh phải, điều này sẽ làm việc để bỏ đặt một đặc biệt bit trong value:

int mask = 1 << bitIndex; 
value &= ~mask; 

Bạn có thể thiết lập các bit sử dụng mã tương tự:

value |= mask; 

nơi mask giống như trước đây. (Điều này giả định rằng chút chỉ số bắt đầu tại 0.)

0

Trong C và C++ sử dụng bit wise AND operator để tạo thành một VÀ mặt nạ:

10101 & 10001 
+0

Điều này không hữu ích cho việc mất một chút tùy ý, vì bạn phải tạo mặt nạ trước thời hạn. –

+0

@QuinnTaylor: OP ** biết ** bit mà anh ta muốn bỏ đặt và nói cụ thể như vậy trong Q, Vì tôi sợ nhận xét và downvote chỉ là tiếng ồn. –

+0

Vấn đề với "giải pháp" này là OP sẽ phải tạo mặt nạ '10001', khi đó chính xác là những gì OP đang cố tính toán.(Tôi đọc câu hỏi của OP khi hỏi về trường hợp chung, khi người ta không biết giá trị thực của 'i' và muốn không ra một chút cụ thể.) –

0

Bitwise functions.

Trong Java:

int num = 0b10101; 
int mask = 1 << bitPosition; 

System.out.println(Integer.toBinaryString(num)); 
num &= ~mask; 
System.out.println(Integer.toBinaryString(num)); 
+0

Không chính xác. Mã của bạn chỉ hoạt động với 'N = 3'. Bit 'N'th được cho bởi' (1 << N) ', với' N = 0.''. Không có gì để làm với 'integerLength'. – EJP

+0

@EJP Ahh, đã quá muộn khi tôi đang gõ, cố định. – Jeffrey

1

Nếu bạn đang đối phó với litterals, sau đó bạn có thể chỉ làm việc với những con số hex. Chuyển đổi các mẫu bit thành số thập phân:

10101 => 0x15 
00100 => 0x04 

Vì vậy, mã C sau sẽ đặt b thành kết quả bạn muốn.

int a = 0x15; 
int b = a & ~(0x04); 

Nếu bạn muốn một cái gì đó chung chung bạn có thể có một hàm C (với tất cả các phạm vi việc kiểm tra loại bỏ) như

int clearBit(int value, int bit) 
{ 
    // Assume we count bits starting at 1 
    return value & ~(1 << (bit -1)); 
} 
10

Để xóa hoặc unset một chút

Sử dụng Bitwise AND (&) để xóa một chút.

number &= ~(1 << x); 

Điều đó sẽ xóa bit x. Bạn phải đảo ngược chuỗi bit với toán tử NOT bitwise (~), sau đó AND nó.

LƯU Ý: ở đây x là vị trí của bit bắt đầu từ 0 đến LSB.

0

Bạn có thể chuyển đổi các bit thứ n

result = số^(1 < < bitIndex)

+1

Toggling không được xóa. OP muốn bit ở lại 0 nếu nó đã là 0. –

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