2017-10-13 28 views
5

मैं सी # में हीरा-स्क्वायर एल्गोरिदम के implementation के बारे में पढ़ रहा हूं जो निर्बाध बनावट बनाने के लिए चारों ओर लपेटता है। अगले बिंदु की गणना करने के लिए, एक वर्ग या हीरे में व्यवस्थित चार नमूना बिंदुओं का औसत लिया जाता है। यदि एक नमूना बिंदु बनावट के किनारे के निहित है, तो यह दूसरी तरफ लपेटा जाता है। यह रैपिंग निम्न विधि का उपयोग किया जा करने के लिए प्रकट होता है:बिटवाई के कार्य और इस कथन में क्या कार्य है?

public double sample(int x, int y) 
{ 
    return values[(x & (width - 1)) + (y & (height - 1)) * width]; 
} 

अनुसंधान का एक छोटा सा मुझसे कहता है कि यह एक बिटवाइज़ ऑपरेटर है। मैंने पहले उनका उपयोग नहीं किया है, और wikipedia article प्रबुद्ध नहीं था। क्या कोई इस बात में समझा सकता है कि & ऑपरेटर इस विधि में क्या कर रहा है?

संपादित करें: बनावट आयाम हमेशा दो

उत्तर

8

की शक्तियों रहे हैं यह "रैपिंग" के लिए है। width और height मान लिया जाये कि दो की शक्तियों (अन्यथा यह काम नहीं करता है, ताकि बेहतर सच हो चुकी थी) कर रहे हैं, x & (width - 1) ज्यादातर x % width के बराबर है, सिवाय इसके कि यह भी नकारात्मक x के लिए (एक नकारात्मक x साथ काम करता है, जबकि x % width एक नकारात्मक होता नतीजा) और लगभग निश्चित रूप से तेज़ है।

या एक उदाहरण के साथ नेत्रहीन यह डाल करने के लिए कहते हैं, width = 64 और x = 64+12 = 76, तो

x  = 00000000 00000000 00000000 01001100 
w  = 00000000 00000000 00000000 01000000 
w-1  = 00000000 00000000 00000000 00111111 
x & w-1 = 00000000 00000000 00000000 00001100 = 12 

आप w-1 के रूप में देख सकते हैं, आपरेशन x & w-1 संभालने, केवल x के नीचे बिट्स लेने की तरह है बेशक w अभी भी दो की शक्ति है। तो वजन 64 के साथ बिट्स और 64 के गुणक हटा दिए जाते हैं, जैसे कि एक वास्तविक "मॉड्यूलो 64" ऑपरेशन (यदि आप हस्ताक्षर किए गए पूर्णांक के साथ काम कर रहे हैं, तो % नहीं है), यह शेष है)।

संबंधित मुद्दे