2011-02-11 10 views
19

की जिज्ञासा से बाहर है, तो आप कैसे बता सकते हैं कि कोई संख्या x दो बार (x = 2^n) की शक्ति है, बिना रिकर्सन का उपयोग किए।यह पता लगाना कि कोई संख्या 2

धन्यवाद

+0

आपको बस एक बिट की जांच करने की आवश्यकता है। – phwd

उत्तर

39

एक तरह से बिटवाइज़ और उपयोग करने के लिए है। यदि कोई संख्या $x दो की शक्ति है (उदाहरण के लिए, 8 = 1000), तो इसके पूर्ववर्ती (7 = 0111) के साथ सामान्य में कोई बिट नहीं होगा। तो अगर आप लिख सकते हैं:

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

नोट: यह नंबर से $ x == 0.

+1

क्या इंट के लिए न्यूनतम मूल्य पर कोई और एज केस है? – anon

+1

@anon - अभिव्यक्ति हमेशा और केवल शून्य-शून्य लौटाती है यदि प्रारंभिक मान में एकाधिक बिट सेट होते हैं। एक int के लिए न्यूनतम मान एक बिट सेट है, जो कि दोहरे पूरक (अधिकांश प्लेटफॉर्म पर) के उपयोग के कारण है, फिर भी 2 की शक्ति नहीं है। इसलिए हाँ, मुझे लगता है कि आप सही हैं। आपको (8 बिट्स केस के लिए) 10000000 और 01111111 == 0 मिलते हैं, जो सत्य बता रहे होंगे अगर ये हस्ताक्षरित मान थे (128 2 की शक्ति है), लेकिन हस्ताक्षरित मानों के लिए नहीं (-128 की शक्ति नहीं है 2)। – Steve314

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

ऐसा लगता है कि जावा में पहली बार एक उचित समाधान पसंद है - ** लेकिन यह नहीं है! ** कभी भी '==' ऑपरेटर के साथ फ्लोट/युगल की तुलना न करें! – SebastianH

8

घटाना 1 के लिए एक झूठी सकारात्मक दे देंगे, तो और यह मूल संख्या के साथ। यदि परिणाम शून्य है, तो यह दो की शक्ति थी।

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

(माफ करना, मेरी पीएचपी जंग लगी है ...)

+3

हाहा यह PHP नहीं है! चर बहुत समृद्ध और अमीर हैं! – mauris

+0

बहुत बुरा यह सिंटैक्स त्रुटि नहीं है यदि आप अपने चर को तोड़ देते हैं। – dan04

3

यदि यह 2 के एक शक्ति है? ठीक है, एक तरह से यह बाइनरी में कनवर्ट करते हैं, और केवल 1 1 की उपस्थिति की पुष्टि करने के लिए है ...:

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

पूर्णता के लिए, यदि संख्या एक नाव है, तो आप अगर यह द्वारा दो की एक शक्ति है परीक्षण कर सकते हैं पाठक के लिए

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

व्यायाम:: chacking अगर अपूर्णांश सब शून्य है कोने मामलों और बड़े एंडियन मशीन।

0

किसी भी दशमलव संख्या के बाइनरी समकक्ष में जो दो की शक्ति है, उसके बाइनरी समकक्ष में केवल 1 की घटना होगी।

<?php 
    $number = 4096; 
    $bin = decbin($number); 
    if ($number != 1 && substr_count($bin,1) == 1) { 
     echo "Yes"; 
    } else { 
     echo "No"; 
    } 
?> 
संबंधित मुद्दे