01/10/2018, 12:15
Nhờ giải thích ý nghĩa câu lệnh
Em có hàm kiểm tra 1 số có phải là lũy thừa bậc n với cơ số là 2 hay không:
def is_Power_of_two(n):
return n > 0 and (n & (n - 1)) == 0
print(is_Power_of_two(4))
print(is_Power_of_two(36))
print(is_Power_of_two(16))
Trong đoạn code e chưa hiểu ý nghĩa của dòng lệnh (n & (n - 1)) == 0
Nhờ các anh chị giúp gải thích e với ạ .
Bài liên quan





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ố
1và0.Hãy quay trở lại cách mà các con số ở dạng nhị phân.
Và đương nhiên còn tăng lên
5 6 7 8...nữa. Với số 0. Thì sẽ làĐó 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,
4bên binary là100. Vậy còn số4 - 1là gì? Đó chính là011.Và nó cứ thế, nếu
2^x = n. Thìnbên binary có dạng100000...bắt đầu với số1và toàn bộ phía sau là0. Cònn - 1thì sẽ có dạng011111...bắt đầu với số0và 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à
10101và01101đi, nếu ta dùng & thì sẽ làQuay trở lại vấn đề trên, ta sẽ có
Hope it helps.
Híc , xin lỗi anh, em viết lộn, ý em là
kiểm tra 1 số có phải lũy thừa bậc n với cơ số 2 hay không.Cám ơn anh nhiều ạ
Dễ thấy rằng 10000… - 1 = 01111… Mà 1 & 0 = 0 nên các lũy thừa của 2 được nhận đúng (0).
Ngược lại, nếu số có hai bit 1 trở lên thì những bit cao hơn bit 1 có giá trị thấp nhất sẽ không đổi, vì vậy AND lại không thể bằng 0 do còn ít nhất một bit 1.
Phiền các anh giúp e thêm đoạn dưới đây nữa ạ:
Đoạn Code cũng tương tự như Code bên trên nhưng với cơ số là 4 ạ (
kiểm tra 1 số có phải lũy thừa bậc n với cơ số 4 hay không.)em không hiểu cái
0b11và>>= 2nghĩa là gì ạ ?Cám ơn mọi người !
Số nhị phân 11 = số 3 ở hệ thập phân.
a >>= 2 <=> a //= 4Cám ơn anh nhiều ạ. Mà sao lại phải thêm
0bở phía trước vậy anh, em thử bỏ nó đi thì không thấy kq có gì khác biệt cả.Số 11 với số 3 (0b11) khác nhau xa lắm
not(n & 0b11) = true, hay n & 0b11 = false (0), vậy hai bit cuối phải 0 hết vòng lặp mới chạy. Nếu số bit có nghĩa là chẵn thì cuối cùng n = 0b10, ngược lại n = 0b01. Mà 4^n thì có 2n bit 0 phía sau số 1. Nếu n = 0b11 thì loại, và n không thể bằng 0b00, vì số 0 bị loại.