Hướng dẫn how do you check if an integer is a power of 2 in python? - làm thế nào để bạn kiểm tra xem một số nguyên có phải là lũy thừa của 2 trong python không?

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

                        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
    
    0:

    import math
    
    math.log(n, 2).is_integer()
    
  •                     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
    
    1:

    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ý).

  •                     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
    
    4:
    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:

  •                     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
    
    5 sẽ cho
                        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
    
    6
  •                     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
    
    7 sẽ cho
                        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
    
    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
    
    9 sẽ cho
                        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
    
    8 !!

Đ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

import math

math.log(n, 2).is_integer()
2 với
                    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
0: 0,26 giây

Count_1: 0,21 giây

Check_1: 0,2 giây

import math

math.log(n, 2).is_integer()
7: 0,19 giây

import math

math.log(n, 2).is_integer()
4: 0,1 giây

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 "

Làm thế nào để bạn kiểm tra nếu một int là một sức mạnh của 2?

Tiếp tục chia số cho hai, tức là làm n = n/2 lặp lại cho đến khi n trở thành 1. trong bất kỳ lần lặp nào, nếu n%2 trở thành không khác và n không phải là 1 thì n không phải là sức mạnh của 2. Nếu n trở thành 1 Sau đó, nó là một sức mạnh của 2. In any iteration, if n%2 becomes non-zero and n is not 1 then n is not a power of 2. If n becomes 1 then it is a power of 2.

Làm thế nào để bạn tìm thấy sức mạnh của hai số trong Python?

POW (số, số mũ) chức năng để tìm sức mạnh của số ...
Nhập toán.in (toán học. pow (4,2)) chạy.Nhập mô -đun toán học trong Python ..
DEF POWER (N, E): Res = 0.cho i trong phạm vi (e): res *= n.Trả lại res.In (POW (4,2)) chạy.....
DEF POWER (N, E): Nếu E == 0: Trả về 1. Elif E == 1: Trả về n.Khác: return (n*power (n, e-1)).

Làm thế nào để bạn gõ vào sức mạnh của 2 trong Python?

Toán tử có thể được sử dụng để thực hiện số học số mũ trong Python là **.Với hai toán hạng số thực, một ở mỗi bên của toán tử, nó thực hiện tính toán theo cấp số nhân (2 ** 5 dịch thành 2*2*2*2*2).Lưu ý: Toán tử số mũ ** Trong Python hoạt động theo cách tương tự như hàm POW (A, B).2*2*2*2*2 ). Note: Exponent operator ** in Python works in the same way as the pow(a, b) function.

Làm thế nào để bạn đánh giá một sức mạnh trong Python?

Hàm python pow () Hàm pow () trả về giá trị của x cho công suất của y (xy).Nếu có tham số thứ ba, nó sẽ trả lại x cho sức mạnh của y, mô đun z.The pow() function returns the value of x to the power of y (xy). If a third parameter is present, it returns x to the power of y, modulus z.