2013-02-08 18 views
5

मुझे सी में किसी संख्या के लॉग बेस 2 की गणना करने की आवश्यकता है लेकिन मैं गणित पुस्तकालय का उपयोग नहीं कर सकता। उत्तर को निकटतम int तक सटीक होने की आवश्यकता नहीं है। मैंने इसके बारे में सोचा है और मुझे पता है कि मैं थोड़ी देर के लूप का उपयोग कर सकता हूं और < 2 तक संख्या को विभाजित रख सकता हूं, और पुनरावृत्तियों की गिनती रखता हूं, लेकिन क्या यह बिटवाई ऑपरेटरों का उपयोग कर संभव है?बिटवाई ऑपरेटरों का उपयोग कर कंप्यूटर लॉग बेस 2 कैसे करें?

+3

आप गिनी जाती हैं [स्थानांतरण] (http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts) थोड़ा सा ऑपरेटर के रूप में? यदि ऐसा है, तो जवाब बहुत स्पष्ट है। यदि नहीं, तो यह मुश्किल है। – abarnert

+0

0_o आप गणित पुस्तकालय का उपयोग क्यों नहीं कर सकते? –

+0

@ जैकमेन: संभवतः यह या तो होमवर्क, या स्वयं शिक्षण समकक्ष है। लेकिन यह ठीक है; ऐसा लगता है कि उसने इसमें कुछ प्रयास किया है (वह हमेशा एक कामकाजी समाधान है), और यह देखने के लिए संकेतों की तलाश कर रहा है कि ऐसा करने का दूसरा तरीका है, न कि हमें उसके लिए अपना होमवर्क करने के लिए कहें। – abarnert

उत्तर

6

यदि आप थोड़ा सा ऑपरेटर के रूप में shifting गिनते हैं, तो यह आसान है।

आप पहले से ही जानते हैं कि कैसे द्वारा 2.

x >> 1 लगातार प्रभाग द्वारा यह करने के लिए सी

में किसी भी अहस्ताक्षरित पूर्णांक के लिए x/2 के रूप में ही आप इस तेजी से बनाने के लिए की जरूरत है, आप एक कर सकते हैं "विभाजित करें और जीतें" -शिफ्ट, कहें, एक समय में 4 बिट्स जब तक आप 0 तक नहीं पहुंच जाते, फिर वापस जाएं और अंतिम 4 बिट्स देखें। इसका मतलब है कि प्रत्येक के 63 में से 16 बदलाव और 1 9 की तुलना में तुलना करता है। चाहे यह एक आधुनिक सीपीयू पर वास्तव में तेज़ है, मैं परीक्षण के बिना नहीं कह सकता था। और आप इसे पहले चरण में ले जा सकते हैं, पहले 16 के समूह, फिर 4, फिर 1. संभवतः यहां उपयोगी नहीं है, लेकिन यदि आपके पास कुछ 1024-बिट पूर्णांक हैं, तो यह विचार करने योग्य हो सकता है।

+0

धन्यवाद, मुझे नहीं पता था कि यह कितना स्पष्ट था। मैं यह समझ गया। – SKLAK

+0

@ स्क्लाक: अतिरिक्त मज़े के लिए, '/ 2' और' >> 1' कोड को -O2 के साथ संकलित करने का प्रयास करें और देखें कि यह अलग कैसे है। यदि कोई दूसरे की तुलना में काफी तेज है, तो आप दोनों के लिए सटीक कोड प्राप्त कर सकते हैं। – abarnert

+0

वे केवल 'हस्ताक्षरित' के लिए समान होंगे। 'Int' के लिए, साइन बिट को पहले से जोड़ने के लिए एक अतिरिक्त ऑपरेशन है, जो सुनिश्चित करता है कि परिणाम नकारात्मक अनंतता के बजाय शून्य की ओर गोल करता है। –

10

पहले से ही abamert द्वारा उत्तर दिया लेकिन सिर्फ अधिक ठोस है कि यह कैसे आप इसे कोड होता है होने के लिए:

Log2(x) = result 
while (x >>= 1) result++; 
संबंधित मुद्दे