Thao tác bit
Một cách tiếp cận sẽ là sử dụng các thao tác bit:bit manipulations:
[n & [n-1] == 0] and n != 0
Giải thích: Mỗi sức mạnh của 2 có chính xác 1 bit được đặt thành 1 [bit trong chỉ số nhật ký-2 của số đó]. Vì vậy, khi trừ 1 từ nó, bit đó lật xuống 0 và tất cả các bit trước lật xuống 1. Điều đó làm cho 2 số này nghịch đảo của nhau như vậy khi và chúng tôi sẽ nhận được 0 do kết quả. every power of 2 has exactly 1 bit set to 1 [the bit in that number's log base-2 index]. So when subtracting 1 from it, that bit flips to 0 and all preceding bits flip to 1. That makes these 2 numbers the inverse of each other so when AND-ing them, we will get 0 as the result.
Ví dụ:
n = 8
decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0
| ^ | |
binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0
| ^ | | & 0 1 1 1
index | 3 2 1 0 | | -------
0 0 0 0
-----------------------------------------------------
n = 5
decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4
| | |
binary | 1 0 1 | 1 0 0 | 1 0 1
| | | & 1 0 0
index | 2 1 0 | | ------
1 0 0
Vì vậy, kết luận, bất cứ khi nào chúng tôi trừ một số từ một số và kết quả với chính số đó và điều đó trở thành 0 - số đó là sức mạnh của 2!
Tất nhiên, và bất cứ điều gì với 0
sẽ cho 0, vì vậy chúng tôi thêm kiểm tra cho n != 0
.
math
Chức năng
Bạn luôn có thể sử dụng các hàm toán học, nhưng lưu ý rằng sử dụng chúng mà không cần quan tâm có thể gây ra kết quả không chính xác:could cause incorrect results:
math.log[x[, base]]
với
0:n = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
import math math.log[n, 2].is_integer[]
1:n = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
math.log2[n].is_integer[]
Đáng lưu ý rằng đối với bất kỳ
n = 8
decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0
| ^ | |
binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0
| ^ | | & 0 1 1 1
index | 3 2 1 0 | | -------
0 0 0 0
-----------------------------------------------------
n = 5
decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4
| | |
binary | 1 0 1 | 1 0 0 | 1 0 1
| | | & 1 0 0
index | 2 1 0 | | ------
1 0 0
2 nào, cả hai chức năng sẽ ném n = 8
decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0
| ^ | |
binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0
| ^ | | & 0 1 1 1
index | 3 2 1 0 | | -------
0 0 0 0
-----------------------------------------------------
n = 5
decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4
| | |
binary | 1 0 1 | 1 0 0 | 1 0 1
| | | & 1 0 0
index | 2 1 0 | | ------
1 0 0
3 vì nó không được xác định về mặt toán học [và do đó không nên đưa ra một vấn đề hợp lý].
4:n = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
abs[math.frexp[n][0]] == 0.5
Như đã lưu ý ở trên, đối với một số số, các chức năng này không chính xác và thực sự cho kết quả sai:FALSE RESULTS:
5 sẽ chon = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
6n = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
7 sẽ chon = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
8n = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
9 sẽ chon = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
8 !!n = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
Điều này là do các chức năng math
sử dụng phao và những chức năng đó có vấn đề chính xác vốn có.
[Mở rộng] Thời gian
Một số thời gian đã trôi qua kể từ khi câu hỏi này được hỏi và một số câu trả lời mới đã đưa ra những năm qua. Tôi quyết định mở rộng thời gian để bao gồm tất cả chúng.
Theo các tài liệu toán học,
import math
math.log[n, 2].is_integer[]
2 với một cơ sở nhất định, thực sự tính toán import math
math.log[n, 2].is_integer[]
3 rõ ràng là chậm. import math
math.log[n, 2].is_integer[]
4 được cho là chính xác hơn, và có lẽ hiệu quả hơn. Thao tác bit là các hoạt động đơn giản, không gọi bất kỳ chức năng nào.Vì vậy, kết quả là:
EV: 0,28 giây
2 vớiimport math math.log[n, 2].is_integer[]
0: 0,26 giâyn = 8 decimal | 8 = 2**3 | 8 - 1 = 7 | 8 & 7 = 0 | ^ | | binary | 1 0 0 0 | 0 1 1 1 | 1 0 0 0 | ^ | | & 0 1 1 1 index | 3 2 1 0 | | ------- 0 0 0 0 ----------------------------------------------------- n = 5 decimal | 5 = 2**2 + 1 | 5 - 1 = 4 | 5 & 4 = 4 | | | binary | 1 0 1 | 1 0 0 | 1 0 1 | | | & 1 0 0 index | 2 1 0 | | ------ 1 0 0
Count_1: 0,21 giây
Check_1: 0,2 giây
7: 0,19 giâyimport math math.log[n, 2].is_integer[]
4: 0,1 giâyimport math math.log[n, 2].is_integer[]
Bit Ops: 0,08 giây
Mã tôi đã sử dụng cho các biện pháp này có thể được tạo lại trong bản sao này [được đặt từ cái này].
Cách kiểm tra xem số nguyên có phải là nguồn 2 với các ví dụ mã không
Trong phiên này, chúng tôi sẽ cố gắng giải quyết cách kiểm tra xem số nguyên có phải là sức mạnh của 2 câu đố bằng cách sử dụng ngôn ngữ máy tính không. Mã theo sau phục vụ như một minh họa của điểm này.
if [x && ![x & x - 1]]
Cách kiểm tra xem số nguyên có phải là công suất 2 được giải quyết bằng một số kịch bản hay không, như chúng ta đã thấy.
Sức mạnh của hai là một số mẫu 2N trong đó n là một số nguyên, nghĩa là kết quả của số mũ với số hai là cơ sở và số nguyên n là số mũ.
Làm thế nào để bạn kiểm tra xem một số nguyên có phải là sức mạnh của 2 hay không trong Python?
- Một phương pháp đơn giản cho điều này là chỉ cần lấy nhật ký của số trên cơ sở 2 và nếu bạn nhận được số nguyên thì số đó là công suất là 2.
- Một giải pháp khác là tiếp tục chia số cho hai, tức là làm n = n/2 lặp đi lặp lại.
- Tất cả sức mạnh của hai số chỉ có một bộ bit.
Làm thế nào để bạn kiểm tra xem một số là số điện?
Một giải pháp đơn giản là liên tục tính toán sức mạnh của x. Nếu một sức mạnh trở nên bằng y, thì y là một sức mạnh, thì không phải là 23-tháng 5 năm 2022
Làm thế nào để bạn kiểm tra xem một số có phải là sức mạnh của 2 trong JavaScript không?
Chúng tôi được yêu cầu viết một hàm, giả sử isPoweroftwo [] có số lượng dương và trả về boolean dựa trên thực tế liệu con số có phải là một số sức mạnh của 2.26-tháng 8
Làm thế nào để bạn tính toán sức mạnh của 2?
Như đã đề cập, thậm chí 2 đến công suất của 30 sẽ tuân theo cùng một quy trình: Nhân 2 ba mươi lần :: 2 = 1, 073, 741, 824 2^{30} = 2 \ lần 2 \ lần ở đây là một ví dụ:
- Viết đối ứng của 2, là 21.
- Tìm ra số mũ.
- Nhân cơ sở mới nhiều lần như số mũ cho biết.
Sức mạnh của 2 là 32 là 32?
Trả lời: 5 là sức mạnh của 2 là 32,07-tháng 1-2019
Giá trị của 0 Power 2 là bao nhiêu?
Câu trả lời của 0 cho công suất của 2 là 0 [0].
Sức mạnh số nguyên của 4 là gì?
Trình tự sức mạnh thứ tư của các số nguyên [còn được gọi là Biquadrates hoặc số tesseractic] là: 0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000, 14641, 20736, 28561, 38416, 50 65536, 83521, 104976, 130321, 160000, 194481, 234256, 279841, 331776, 390625, 456976, 531441, 614656, 707281, 81
Làm thế nào để bạn viết một sức mạnh 2 trong C ++?
pow [] là chức năng để có được sức mạnh của một số, nhưng chúng ta phải sử dụng #include trong c/c ++ để sử dụng hàm pow [] đó. Sau đó, hai số được thông qua. Ví dụ - POW [4, 2]; Sau đó, chúng tôi sẽ nhận được kết quả là 4^2, là 16,17-sept-2022
Nó có nghĩa là gì khi một số là một sức mạnh của 2?
Số mũ của một số cho biết bao nhiêu lần để sử dụng số trong phép nhân. Trong 82 "2" cho biết sử dụng 8 hai lần trong phép nhân, do đó, 82 = 8 × 8 = 64. Trong từ: 82 có thể được gọi là "8 đến công suất 2" hoặc "8 đến công suất thứ hai" hoặc đơn giản là " 8 bình phương "