num &= num - 1;
xóa bit ít quan trọng nhất được đặt bằng num.
Thuật toán này đếm số bit được đặt bằng cách xóa chúng và tăng bộ đếm cho đến khi hết.
Để hiểu lý do tại sao nó xóa bit ít quan trọng nhất, bạn cần phải suy nghĩ về những gì decrementing không cho các bit và tất nhiên hiểu những gì các hoạt động &
nào.
Trừ trong tác phẩm nhị phân giống như quy trình chúng tôi được dạy bằng số thập phân dưới dạng trẻ em. Bạn làm việc từ phải (ít quan trọng nhất) sang trái, chỉ cần trừ các chữ số riêng lẻ khi có thể và "mượn" từ chữ số tiếp theo khi cần.
Khi trừ 1 từ số nhị phân kết thúc bằng một số 0, thì "mượn" và trừ tất cả các số 0 ở vị trí thấp hơn số phải từ 1 đến 1 và rẽ phải 1 đến 0 (vì nó được mượn).
Sau đó, áp dụng các nhà điều hành &
lá tất cả các chữ số nhỏ hơn số không bởi vì họ đang không ở num
, và thiết lập các bit quan trọng nhất của num
bằng không bởi vì nó là zero trong num-1
.
Cả hai thao tác này đều không thay đổi chữ số có nghĩa.
Dưới đây là danh sách tốt gồm bit twiddling hacks bao gồm danh sách này, là do Brian Kernighan.
Nguồn
2012-08-04 17:25:57
Lưu ý rằng điều này còn được gọi là số lượng dân số hoặc trọng lượng ham muốn. – delnan
btw, mệnh đề if nên được sửa đổi trong khi (num> 0) – Pompair
@Pompair: 'while (num)' giống như 'while (num! = 0)', do đó, nó là chính xác. –