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ố
1
và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,
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ạng100000...
bắt đầu với số1
và toàn bộ phía sau là0
. Cònn - 1
thì sẽ có dạng011111...
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à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
0b11
và>>= 2
nghĩ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 //= 4
Cá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.