Cách bạn nêu không ổn, vì nếu bit thứ k mà bằng 0 thì nó vẫn trừ, sẽ bị sai kết quả.
Thay vào đó, dùng phép toán and sẽ hay hơn.
Ta có bảng chân trị.
0 and 0 = 0 (*)
0 and 1 = 0
1 and 0 = 0 (*)
1 and 1 = 1
Chú ý đến dòng 1 và 3, nó cho thấy một bit and với 0 sẽ cho ra 0 (tắt bit).
Ngược lại, nếu and với 1 sẽ cho ra chính nó (giữ nguyên).
Như vậy, ta cần n and x
nào đó, mà số x nào có dạng 11111011
tại vị trí cần tắt bit.
Bài toán của bạn có một chút rắc rối ở chỗ là đếm thứ tự k từ trái sang phải, bạn cần chuyển vị trí k từ phải sang trái cho dễ (ở đây mình lấy 8 bit số nguyên)
k = 8 + 1 - k;
x = (2^8 - 1) - 2^(k - 1);
Cuối cùng, kết quả sẽ là n and x
. Như ví dụ trên của bạn, n = 37 (00100100), k = 6 (mình tự cho theo kết quả vì input của bạn chưa cho). Chuyển đổi k thành bit thứ 3 từ phải qua trái. Suy ra x = (2^8 - 1) - 2^(k-1) = 255 - 4 = 251. Kết quả 37 and 251 = 33.