Tôi đã đánh lừa thao tác bit và đã xem xét điều này. Nó có thể không hữu ích cho các poster ban đầu bây giờ (3 năm sau), nhưng tôi sẽ trả lời anyway để cải thiện chất lượng cho người xem khác.
Có nghĩa là gì đối với n & (n-1)
bằng 0?
Chúng tôi phải đảm bảo rằng chúng tôi biết rằng vì đó là cách duy nhất để ngắt vòng lặp (n != 0
). Giả sử n=8
. Biểu diễn bit cho điều đó sẽ là 00001000
. Biểu diễn bit cho n-1
(hoặc 7) sẽ là 00000111
. Toán tử &
trả về các bit được đặt trong cả hai đối số. Vì 00001000
và 00000111
không có bất kỳ bit tương tự nào được đặt, kết quả sẽ là 00000000
(hoặc không). Bạn có thể đã bắt gặp rằng số 8 không được chọn ngẫu nhiên. Đó là một ví dụ trong đó n
là sức mạnh của 2. Tất cả các quyền hạn của 2 (2,4,8,16, vv) sẽ có kết quả tương tự.
Điều gì sẽ xảy ra khi bạn chuyển một thứ không phải là số mũ 2? Ví dụ, khi n=6
, biểu diễn bit là 00000110
và n-1=5
hoặc 00000101
. &
được áp dụng cho 2 đối số này và chúng chỉ có một bit chung là 4. Bây giờ, n=4
không bằng 0 để chúng tôi tăng c
và thử quá trình tương tự với n=4
. Như chúng ta đã thấy ở trên, 4 là số mũ của 2 vì vậy nó sẽ phá vỡ vòng lặp trong lần so sánh tiếp theo. Người ta cắt đứt các bit ngoài cùng bên phải cho đến khi n
bằng một sức mạnh của 2.
c
là gì?
Nó chỉ được incrementing bởi một trong mỗi vòng lặp và bắt đầu từ 0. c
là số bit cắt đứt trước số bằng một sức mạnh của 2.
Nguồn
2016-04-01 13:30:41
Hãy suy nghĩ về phép trừ dài và "vay". –
Nó xóa bit ngoài cùng bên phải vì bit ngoài cùng bên phải của 'n - 1' không bao giờ giống với' n'. – 0x499602D2
[Thủ thuật đếm bit của Kernighan!] (Http: //cs.stanford.Bit/~ seander/bithacks.html # CountBitsSetKernighan) – Ternary