2011-02-11 34 views

Trả lời

39

Một cách là sử dụng toán tử AND. Nếu số $x là công suất của hai (ví dụ: 8 = 1000), nó sẽ không có điểm chung nào với tiền thân của nó (7 = 0111). Vì vậy, bạn có thể viết:

($x & ($x - 1)) == 0 

Lưu ý: Điều này sẽ cung cấp cho một dương tính giả với $ x == 0.

+1

Có trường hợp cạnh nào khác ở giá trị nhỏ nhất cho một int không? – anon

+1

@anon - Biểu thức luôn luôn và chỉ trả về khác 0 nếu giá trị ban đầu có nhiều bit được đặt. Giá trị tối thiểu cho một int có một bộ bit, do việc sử dụng bổ sung twos (trên hầu hết các nền tảng), nhưng không phải là một sức mạnh của 2. Vì vậy, có, tôi nghĩ rằng bạn đang phải. Bạn nhận được (đối với trường hợp 8 bit) 10000000 & 01111111 == 0, sẽ cho biết sự thật nếu đây là giá trị chưa ký (128 là lũy thừa của 2), nhưng không phải cho các giá trị đã ký (-128 không phải là công suất của 2). – Steve314

-2
Math.log(x)/Math.log(2) == Math.floor(Math.log(x)/Math.log(2)) 
+1

Điều này trông giống như một giải pháp hợp lý trong Java trên cái nhìn đầu tiên - ** nhưng nó không phải là! ** Không bao giờ so sánh nổi/tăng gấp đôi với toán tử '=='! – SebastianH

8

Subtract 1 từ số lượng, sau đó và nó với số lượng ban đầu. Nếu kết quả bằng không, nó là một sức mạnh của hai.

if (((n-1) & n) == 0) { 
    // power of two! 
} 

(xin lỗi, PHP của tôi là Rusty ...)

+3

haha ​​nó không phải là PHP! biến rất phong phú và giàu có! – mauris

+0

Quá tệ, đó không phải là lỗi cú pháp nếu bạn để các biến của bạn bị hỏng. – dan04

3

Nếu đó là một sức mạnh của 2? Vâng, một cách là chuyển nó sang nhị phân, và xác minh sự hiện diện của chỉ 1 1 ...:

$bin = decbin($number); 
if (preg_match('/^0*10*$/', $bin)) { 
    //Even Power Of 2 
} 
2

Để hoàn chỉnh, nếu số là một phao, bạn có thể kiểm tra xem đó là một sức mạnh của hai bởi chacking nếu mantissa là tất cả các số không:

<?php 
$number = 1.2379400392853803e27; 
$d = unpack("h*", pack("d", $number)); $d = reset($d); 
$isPowerOfTwo = substr($d, 0, 13) == "0000000000000"; 
var_dump($isPowerOfTwo); // bool(true) 

Tập thể dục cho người đọc: trường hợp góc và máy lớn.

0

Trong một số nhị phân tương đương với bất kỳ số thập phân nào là lũy thừa của hai số sẽ chỉ có một lần xuất hiện 1 trong tương đương nhị phân của nó.

<?php 
    $number = 4096; 
    $bin = decbin($number); 
    if ($number != 1 && substr_count($bin,1) == 1) { 
     echo "Yes"; 
    } else { 
     echo "No"; 
    } 
?> 
Các vấn đề liên quan