Nói kiểu này hơi xoắn não. Hàm này là hàm kiểm tra một số xem căn bậc n của nó có phải là 2 hay không.
Với a là một số nguyên dương và căn bậc n của nó là 2 thì a & (a - 1) bằng 0.
Vì sao lại thế? Cái này liên quan tới hai số 1 và 0.
Hãy quay trở lại cách mà các con số ở dạng nhị phân.
x | 4 3 2 1 0
Và đương nhiên còn tăng lên 5 6 7 8... nữa. Với số 0. Thì sẽ là
x | 4 3 2 1 0 # với x là số mũ của 2
----------------------
0 | 0
1 | 1 # 1 ở chỗ 0, nên sẽ là 2^0 = 1
2 | 1 0 # 1 ở chỗ 1, nên sẽ là 2^1 = 1
3 | 1 1 # 1 ở chỗ 1 và 0 nên sẽ là 2^0 + 2^1 = 3
4 | 1 0 0 # 1 ở chỗ 2 nên sẽ là 2^2 = 4
Đó là cách mà các số binary được tạo nên.
Dựa vào cái trên, ta thấy được, 4 bên binary là 100. Vậy còn số 4 - 1 là gì? Đó chính là 011.
Và nó cứ thế, nếu 2^x = n. Thì n bên binary có dạng 100000... bắt đầu với số 1 và toàn bộ phía sau là 0. Còn n - 1 thì sẽ có dạng 011111... bắt đầu với số 0 và toàn bộ phía sau là số 1.
Hãy tạm gác lại đó, bạn nên biết về bitwise này. Nó là bitwise and và thao tác với binary. Hãy giả sử ta có 2 số dạng binary là 10101 và 01101 đi, nếu ta dùng & thì sẽ là
1 0 1 0 1
0 1 1 0 1 # 0 là False, 1 là True, chắc bạn biết với and thì 2 cái cùng True mới ra True đúng chứ?
------------------
0 0 1 0 1 # đây chính là kếu quả của 21 & 13 = 5
Quay trở lại vấn đề trên, ta sẽ có
0 1 1 1 ...
1 0 0 0 ...
--------------------
0 0 0 0 ... # luôn là một dãy số 0. Và đương nhiên, kết quả của nó là 0.
Hope it helps.